当我单独使用获取时,这是有效的。但是,当我在我的程序中使用 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;
}
答案 0 :(得分:1)
gets
在scanf
执行之前开始阅读字符串之前不会跳过空格字符。
第一次输入后,第一次\n
调用留下的缓冲区中有scanf
个字符。此\n
由gets
读取,但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
的文档。