作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在学习 C 中的 char
数组。我编写了一个小程序,它可以处理函数并从终端读取输入,并且在 EOF
上将 printf
char
数组。
例如,如果我输入:hello my name is
并按 Enter 键,我会收到以下输出:hello my z Ͳ
我不明白z Ͳ
来自哪里。有人可以给我解释一下吗?
#include <stdio.h>
const int MAXLENGTH = 10;
int getLine(char[], int);
int main(void) {
char inputString[MAXLENGTH];
getLine(inputString, MAXLENGTH);
printf("%s", inputString);
return 0;
}
// Functions:
int getLine(char destArray[], int length) {
int returnLength;
int input;
for (int i = 0; i < length - 1; i++) {
if ((input = getchar()) != EOF) {
destArray[i] = input;
returnLength = i;
}
}
return returnLength;
}
最佳答案
您的代码中存在多个问题:
您没有在 getLine()
中的目标数组末尾存储空终止符。 .
您应该停止阅读stdin
当您得到换行符( '\n'
)或 EOF
时值。
这是修改后的版本:
#include <stdio.h>
const int MAXLENGTH = 10;
int getLine(char[], int);
int main(void) {
char inputString[MAXLENGTH];
getLine(inputString, MAXLENGTH);
printf("%s\n", inputString);
return 0;
}
// Functions:
int getLine(char destArray[], int length) {
int i, c;
for (i = 0; i < length - 1; i++) {
c = getchar();
if (c == EOF || c == '\n')
break;
destArray[i] = c;
}
destArray[i] = '\0';
return i;
}
运行该程序将显示hello my name is
不适合目标数组,因为程序的输出将为 hello my
在您的程序中,您没有存储超出缓冲区末尾的任何内容,因为您正确测试了 i < length - 1
,但是printf
读取的数据超出 getLine()
设置的第 9 个字节并打印这些地址处内存中的所有内容,直到找到空字节,这是未定义的行为。奇怪的输出是未定义行为的良性副作用,程序也可能崩溃。内存中的字节可能对应于堆栈中存储的 main()
的值。函数本地帧和返回地址。不同的编译器、不同的平台甚至同一程序的不同调用可能会产生不同的输出(后者似乎不太可能,但由于堆栈随机化,在 OS/X 上会发生)。
关于c - 用输入填充 char 数组,但我不明白输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57250963/
我是一名优秀的程序员,十分优秀!