gpt4 book ai didi

c - 用输入填充 char 数组,但我不明白输出

转载 作者:行者123 更新时间:2023-11-30 19:01:47 25 4
gpt4 key购买 nike

所以我正在学习 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com