具有scanf读取字符串的while循环变量的意外行为

时间:2015-06-20 13:07:10

标签: c

当我包括scanf读取字符串时,n的值在下面的代码中突然改变。我也试过%* c,但它仍然显示相同的错误。

 #include<stdio.h>
 #include<string.h>

 int main()
 {
  char str[3];
   int n;
   int t,p=0;
   scanf("%d",&t);

   while(t--)
    {
      printf("t=%d ",t);
      scanf("%d",&n);
       while(n!=0)
        {
          printf("n=%d",n);
          p=0;   
          scanf("%s",str);
          getchar();
          if(strcmp(str,"lhx")==0)
          printf("lhx");
          else
          printf("hhb");
          n--;
         }
      }
     return 0;
  }

2 个答案:

答案 0 :(得分:1)

根据if(strcmp(str,"lhx")==0)判断,您输入的是3个字符。但str只有3个字符的内存。要将其扫描为字符串str至少需要4个字节的内存。

您可以将其更改为:

  char str[4];

但是再次,当你输入4个字符时,你会遇到同样的问题。使用fgets代替scanf(). fgets()可以防止缓冲区溢出。

除此之外:使用main()int main(void)int main(int argc, char**argv)或其等效的标准签名。

答案 1 :(得分:1)

问题是你的数组只能容纳3个字符

char str[3];

所以2个有效字符后跟一个空终止符,但你要用3个字符的字符串检查它。

所以将数组更改为

char str[4];

使用scanf()扫描字符串总是一个坏主意,而不是使用fgets()