在“输入”处停止循环;0“;在C中

在“输入”处停止循环;0“;在C中,c,C,我试图做一个循环,在这个循环中,用户被要求提供汽车型号和年份。循环应该以输入“0”结束,但我无法使其工作,相反,循环继续进行。 我的代码如下所示: char model; int year; while (model != '0') { printf("Input model name (0 quits): "); scanf("%s", &model); if (model == '0') { break;

我试图做一个循环,在这个循环中,用户被要求提供汽车型号和年份。循环应该以输入“0”结束,但我无法使其工作,相反,循环继续进行。 我的代码如下所示:

char model;
int year;

while (model != '0') {
   printf("Input model name (0 quits): ");
   scanf("%s", &model);
   if (model == '0') {
      break;
   } else {
      printf("Input year: ");
      scanf("%d", &year);
      ...

我也尝试过使用atoi()和isdigit(),但似乎没有任何效果。有什么想法吗?

你好,未定义的行为

好的,那么问题是用
%s
将单个字符的地址传递给
scanf
。那不太管用

我们想要的是:

    char model[16];
    while(1) { /* or your preferred infinite loop here */
        printf("Input model name (0 quits): ");
        fgets(model, 16, stdin);
        if (model[0] == '0') break;

        /* continuing on your input */
        printf("Input year: ");
        scanf("%d", &year);
      ...
    }
因此,我们要做的是用
fgets
读取行中的内容,然后检查后面的0,并在0上中断循环。此代码跟随您的线索,不会清理您的输入

读一个字符并没有什么好办法,因为你需要去掉换行符


实际上,我建议将整个过程转换为
fgets()
,但每次只执行一步。

model
在第一次迭代的循环开始时未初始化。而且
model
是字符,因此您应该使用
%c
格式选项和
scanf
,而不是用于字符串的
%s
是未定义行为的配方。即使是一个输入字符也会覆盖您不拥有的内存(实际上存储了两个:一个用于字符,一个用于终止符,而您只为一个字符传递内存)。如果您正在读取单个字符,为什么不使用
fgetc(stdin)
,存储在
int
中,并测试EOF,而不是假设读取工作正常?请仔细阅读scanf的
“%c”
“%s”之间的差异。