c程序不起作用scanf char

时间:2015-04-10 09:06:27

标签: c

#include <stdio.h>
int main() {

    struct cerchio c1, c2;
    float distanza;
    char k;

    //input del centro del primo cerchio
    printf("Enter the coordinate x of the first circle's center: ");
    scanf("%f", &c1.centro.x);
    printf("Enter the coordinate y of the first circle's center: ");
    scanf("%f", &c1.centro.y);

    //input del raggio del cerchio
    printf("Enter the circle's radius: ");
    scanf("%f", &c1.raggio);

    printf("The first circle's center is: (%.2f, %.2f)\n", c1.centro.x,      c1.centro.y);


    printf("Do you want to move this circle? y/n \n");
    //Here is the problem <-------------
    scanf("%s", &k); 

    if(k=='y'){
        moveCircle(&c1);
        printf("Now the circle's center is: (%.2f, %.2f)\n", c1.centro.x, c1.centro.y);
    }
}

在注释//下的scanf中,如果我把%c放到程序结束,这就是问题。输入不起作用!如果我把%s程序完美地运行起来。为什么?我已声明变量k char!

2 个答案:

答案 0 :(得分:3)

scanf("%s", &k); 

应该是

scanf(" %c", &k); 

%c是字符(char)的正确格式说明符,而%s用于字符串。 %c后面的空格字符会跳过所有空格字符,包括无,直到C11标准中指定的第一个非空白字符:

  

7.21.6.2 fscanf功能

     

[...]

     
      
  1. 由空白字符组成的指令通过读取第一个非空白字符(仍然未读取)的输入来执行,或者直到不再能够读取字符为止。该指令永远不会失败
  2.   

当您使用%c时,您的程序不会等待进一步输入的原因是因为标准输入流中存在换行符(\n)({{1} })。记住在输入每个stdin的数据后按输入scanf使用scanf抓取换行符 。相反,此%f会使用scanf捕获此字符。这就是%c没有等待进一步输入的原因。

至于为什么您的其他scanfscanf}没有使用%f,原因是\n跳过了C11标准中的空白字符:< / p>

  

7.21.6.2 fscanf功能

     

[...]

     
      
  1. 跳过输入空白字符(由%f函数指定),除非规范包含isspace[c说明符。 284
  2.   

至于你使用的程序工作原因是因为你很幸运。使用n代替%s会调用Undefined Behavior。这是因为%c匹配一系列非空白字符并在末尾添加NUL终止符。用户输入任何内容后,第一个字符将存储在%s中,而其余字符(如果有)以及k将写入无效的内存位置。

如果您当前正在考虑为什么\0格式说明符没有使用%s,那是因为它会跳过空格字符。

答案 1 :(得分:1)

使用

scanf(" %c",&k);

而不是

scanf("%s", &k); // %s is used for strings, Use %c for character variable.

用于char变量使用&#34; %C&#34 ;.并且不要忘记在%c " %c"之前保留空格,它会跳过换行符和空白字符。