C 尝试通过数组打印用户输入时出现意外输出
此代码将用户输入接收到数组中,然后将其打印出来。每次我打印用户输入时,最后都会打印一个随机的额外字符C 尝试通过数组打印用户输入时出现意外输出,c,C,此代码将用户输入接收到数组中,然后将其打印出来。每次我打印用户输入时,最后都会打印一个随机的额外字符 #include <stdio.h> #include <ctype.h> int main(void) { char arr[100]; char c; printf("Enter a Sentence:"); int i =0; for (i = 0;(c = getchar()) != '\n';++i)
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char arr[100];
char c;
printf("Enter a Sentence:");
int i =0;
for (i = 0;(c = getchar()) != '\n';++i)
arr[i] = c;
arr[++i] = '\n';
for (int i = 0;arr[i] != '\n';++i)
putchar(arr[i]);
}
当你读这行新词时,我得到了abcu,而在第一个
for
循环中的更新表达式将I
增加到了3
然后
arr[++i]='\n'
将i
增加到4,并分配给arr[4]
。从未将任何内容分配给arr[3]
,但当从堆栈中分配数组时,该位置似乎碰巧包含u
。当您读取换行符时,i
刚刚通过第一个for
循环中的更新表达式增加到3
然后arr[++i]='\n'
将i
增加到4,并分配给arr[4]
。从未将任何内容分配给arr[3]
,但当从堆栈分配数组时,此位置似乎碰巧包含u
。此:
for (i = 0;(c = getchar()) != '\n';++i)
arr[i] = c;
arr[++i] = '\n'; /* here */
应该是这样的:
for (i = 0;(c = getchar()) != '\n' && i < 100;++i)
arr[i] = c;
arr[i] = '\n'; /* here */
这:
应该是这样的:
for (i = 0;(c = getchar()) != '\n' && i < 100;++i)
arr[i] = c;
arr[i] = '\n'; /* here */
改变这个
arr[++i] = '\n'; /* this skips the current a[i] & put \n into next position which is incorrect */
到
因为变量i
在这里的循环的条件部分已经增加
for (i = 0;(c = getchar()) != '\n';++i /* before loop terminating i incremented here */) {
arr[i] = c;
}
另外,在声明自身时初始化缓冲区也很好,以避免获得一些垃圾值。例如
char arr[100] = {}; /* zerod whole array */
还要确保这个(c=getchar())!='\n'
不会发生>100次,否则缓冲区溢出会导致未定义的行为。一种可能的方法是
for (i = 0; i < sizeof(arr)-1 && (c = getchar()) != '\n';++i) {
arr[i] = c;
}
for(i=0;i
更改此选项
arr[++i] = '\n'; /* this skips the current a[i] & put \n into next position which is incorrect */
到
因为变量i
在这里的循环的条件部分已经增加
for (i = 0;(c = getchar()) != '\n';++i /* before loop terminating i incremented here */) {
arr[i] = c;
}
另外,在声明自身时初始化缓冲区也很好,以避免获得一些垃圾值。例如
char arr[100] = {}; /* zerod whole array */
还要确保这个(c=getchar())!='\n'
不会发生>100次,否则缓冲区溢出会导致未定义的行为。一种可能的方法是
for (i = 0; i < sizeof(arr)-1 && (c = getchar()) != '\n';++i) {
arr[i] = c;
}
for(i=0;i
关于:
arr[++i] = '\n';
这是在分配'\n'
之前递增的i
,因此arr[++i]
在数组中指向一个额外的字符
这就是打印意外字符的原因
如果将该语句替换为:
arr[i] = '\n';
您的代码应该可以工作。关于:
arr[++i] = '\n';
这是在分配'\n'
之前递增的i
,因此arr[++i]
在数组中指向一个额外的字符
这就是打印意外字符的原因
如果将该语句替换为:
arr[i] = '\n';
您的代码应该可以工作。不需要的include:#include
.1)发布的代码对用户可以输入的字符数没有限制。这是一个潜在的错误。2) 发布的代码无法输出最终的'\n',因此在程序结束之前,数据不会实际输出。您应该为c
使用typeint
,而不是typechar
。这是getchar
返回的类型,如果在检查前将结果强制转换为char
,则无法正确区分EOF
值。这是为什么使用预增量运算符(例如+i
)的另一个示例应避免使用后增量运算符i++
。此代码不应编译。您将定义i
两次:inti=0代码>和用于(int i=0;arr[i]!='\n';++i)
。不需要的包括:#include
。1)发布的代码对用户可以输入的字符数没有限制。这是一个潜在的错误。2) 发布的代码无法输出最终的'\n',因此在程序结束之前,数据不会实际输出。您应该为c
使用typeint
,而不是typechar
。这是getchar
返回的类型,如果在检查前将结果强制转换为char
,则无法正确区分EOF
值。这是为什么使用预增量运算符(例如+i
)的另一个示例应避免使用后增量运算符i++
。此代码不应编译。您将定义i
两次:inti=0代码>和对于(int i=0;arr[i]!='\n';++i)
@JL2210,有许多方法可以更正代码。因此,要求OP以某种方式修复代码,就像您的编辑所做的那样,是非常误导的。这就是为什么我的(原始)答案是“建议”而不是要求具体的解决方案,这样更好吗?@JL2210:是的,这太好了better@JL2210,有许多方法可以更正代码。因此,要求OP以某种方式修复代码,就像您的编辑所做的那样,是非常误导的。这就是为什么我的(原始)答案是“建议”而不是要求具体的解决方案,这样更好吗?@JL2210:是的,这样更好