更改数组y []的范围时,我遇到输出异常的情况。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char x[50];
int y[50];
fgets(x, 50, stdin);
for (int i; i<50; i++){
printf("%c", x[i]);
}
printf("DONE\n");
return 0;
}
要测试该程序,我一直在输入“ 10 10 10”,我希望输入内容会在该程序后面紧跟“ DONE”语句后打印出来。
但是,该代码已输出带有'?DONE' , '
; DONE'或其他特殊字符变体的'10 10 10'。
如果我注释掉“ int y [50]”,它将完全跳过for循环。
来自python / swift / java背景,我不知道发生了什么,为什么不使用im时'y'数组会导致错误。也许这只是C语言的新手,但我什至不知道如何描述问题(因此标题很烂)
注意*有一个'y'数组的点,但是为了简单起见,在尝试解决此问题时,我已将其从程序中删除。
答案 0 :(得分:6)
i
未初始化。从未初始化的变量读取会导致未定义的行为。通常,它们会被堆栈上偶然发生的任何任意数据填充。将i
设置为0
。
当您敲击字符串的末尾时,还应该停止循环。按下'\0'
时停止,或者循环到strlen(x)
。
for (int i = 0; i < 50 && x[i] != '\0'; i++)
或
int len = strlen(x);
for (int i = 0; i < len; i++)
答案 1 :(得分:5)
如果您的目标是仅打印捕获的x [],则更改此内容:
for (int i; i<50; i++){
对此:
for (int i=0; (x[i]!='\0') && (i<50); i++){
答案 2 :(得分:-2)
您给缓冲区的大小为50,使用字符串大小的一部分,然后打印所有数组。您只想打印作为字符串的数组部分。您可以执行以下操作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char x[50];
int y[50];
fgets(x, 50, stdin);
for (int i; i<strlen(x); i++){
printf("%c", x[i]);
}
printf("DONE\n");
return 0;
}