C代码表现异常,特殊字符从何而来?

时间:2019-09-26 19:39:47

标签: c arrays

更改数组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'数组的点,但是为了简单起见,在尝试解决此问题时,我已将其从程序中删除。

3 个答案:

答案 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;
}