当我使用scanf时,为什么获取不起作用?

时间:2014-01-09 19:51:19

标签: c

当我单独使用获取时,这是有效的。但是,当我在我的程序中使用 scanf 时,它不起作用。谁能解释我错过了什么?

#include <stdio.h>
#include <stdlib.h>

int main(){
    char a[]="computer";
    char b[]={'p','c','\0'};
    char c[30];
    char d[30];
    printf("a=%s,b=%s\n",a,b);
    printf("enter a word\n");
    scanf("%s",c);
    printf("%s",c);
    printf("enter a sentence\n");
    gets (d);
    printf("%s",d);
    return 0;
}

4 个答案:

答案 0 :(得分:1)

getsscanf执行之前开始阅读字符串之前不会跳过空格字符。
第一次输入后,第一次\n调用留下的缓冲区中有scanf个字符。此\ngets读取,但scanf会跳过此空白字符 这可以通过在getchar调用后使用scanf语句来解决。

printf("enter a word\n");
scanf("%s",c);
getchar();  

不要gets使用scanf(它们不检查数组绑定),而是使用fgets

printf("enter a word\n");
fgets(c, 30, stdin);
printf("%s",c);
printf("enter a sentence\n");
fgets(d, 30, stdin);
printf("%s",d);

答案 1 :(得分:1)

Scanf留下“\ n”(没有引号),然后gets()函数只读取它。

答案 2 :(得分:1)

scanf("%s",c)在<{1}}中离开 Enter \n。当stdin执行时,它消耗了它并返回一个空字符串。 gets()将所有数据读入gets()并在返回之前将其修剪掉。

格式说明符,如\n等(除%d %s之外的所有内容)和空格格式指令,如%n %c %[直接" ",以跳过前导空格。 scanf()本身不会跳过前导空格。

建议使用scanf()并避免使用fgets()

gets()

答案 3 :(得分:0)

scanf之前自动删除空白它正在尝试获取的数据。一个例外是字符格式(主要是%c),它不会删除空格。但是,scanf在基准之后留下空白。因此,你需要一种摆脱它的方法。使用

getc(stdin);

然后你可以继续你的快乐方式。 This page有更多关于getc的文档。