这个C程序有什么问题吗?

时间:2010-05-15 10:42:37

标签: c

它应该给我输入用户输入的数量。但它给出了100.我用gcc编译。

#include <stdio.h>

int arr[100];
int count=0;
int max=100;


int main(){
 int i, input;
 printf("Enter integer values one by one, q to quit.\n");
 for(i=0;i<max;i++){
  scanf("%d",&input);
  arr[i]=input;
  if(input=='q')break;
  count++;
 }
 printf("You entered %d values.\n",count);
 return 0;
}

7 个答案:

答案 0 :(得分:5)

如果您正在读取数字变量,它实际上不能具有值'q',因此您的测试将无效。如果你想编写这样的代码,你应该将用户输入读入字符串,检查字符串是否包含“q”,如果没有将其转换为整数。

答案 1 :(得分:3)

scanf具有返回值。用它来测试scanf是否真的能够解析任何东西。在您的场景中,'q'永远不会存储在变量input中,因为它是char或数字表示。您不能将“q”读作“%d”,因此scanf将无声地失败。

测试scanf的返回值以决定break

答案 2 :(得分:1)

scanf%d不理解'q'。您可以检查scanf的返回值 - 如果它返回0,则用户没有输入有效数字。

如果只有q而不是其他非数字字符串应该终止循环,请读入一个字符串并检查它是否为q,如果没有将其转换为带有atoi()的int。

答案 3 :(得分:0)

可爱。输入'q'会导致scanf失败,并且无论最后一个值是什么,都会留下input。这个破碎的循环继续到范围的末尾。当然,测试input=='q'永远不会成功。

答案 4 :(得分:0)

:) 让我修改这个程序:

#include <stdio.h> 

int arr[100]; 
int count=0; 
int max=100; 


int main(){ 
 int i, input; 
 printf("Enter integer values one by one, -1 to quit.\n"); 
 for(i=0;i<max;i++){ 
  scanf("%d",&input); 
  arr[i]=input; 
  if(input==-1)break; 
  count++; 
 } 
 printf("You entered %d values.\n",count); 
 return 0; 
}

您不能使用数字var来获取char值。 如果您像这样更改它,它将起作用。 :)

答案 5 :(得分:0)

当输入字符与转换规范不匹配时,

scanf将在代码中返回0。但是,scanf的下一次调用将在最后一次转换后的字符后立即恢复搜索。因此,您可以尝试以下代码:

#include <stdio.h>

int arr[100];
int count=0;
int max=100;


int main(){
   int i, input, ret;
   char end; 
   printf("Enter integer values one by one, q to quit.\n");
   for(i=0;i<max;i++)
   {
      ret = scanf("%d",&input);
      if (!ret)
      {
         scanf("%c", &end);
         if ( end == 'q')
            break;
         else
           continue;
      }
      arr[i]=input;
      count++;
   }
   printf("You entered %d values.\n",count);
   return 0;
}

通过执行此操作,您可以确保控件不会从循环中退出,除非您输入q并且只将合法值复制到数组中。

答案 6 :(得分:-1)

通过输入'q'的ascii值而不是q /

退出程序