我正在使用 GCC 编译器
我也想扫描白色字符,所以我使用 scanf("%[^\n]s",&name)
并且效果很好。
说代码是
void main(){
char name[20];
scanf("%[^\n]s",&name);
printf("%s",name);
}
但是当我尝试将它与结构变量一起使用时,该语句不再起作用。
struct book { char name[20];};
main(){
struct book buk[10];
int i;
for(i=0;i<3;i++)
{
printf("Enter name of book %d",i+1);
scanf("%[^\n]s",&buk[i].name);}
}
scanf 语句不执行。
但是如果我使用简单的 scanf("%s",&name);
它就可以正常工作。
有人可以帮我解决这个问题吗?
最佳答案
我使用了 scanf("%[^\n]s",&name)
并且它工作得很好?不,它工作得不好。阅读 scanf()
的手册页,上面写着
int scanf(const char *format, ...);
第一个参数是 char*
类型,但 &name
不是 char*
类型。
这个
char name[20];
scanf("%[^\n]s",&name);
应该是
scanf("%[^\n]",name);/* & is not needed as name itself address */
而且它应该只是“%[^\n]”
而不是“%[^\n]s”
。正确的是
scanf(" %19[^\n]",name); /* giving space before % prevents reading extra characters */
此外,最好使用fgets()
。例如
char *p = fgets(buk[i].name),sizeof(buk[i].name),stdin);
if(p != NULL) {
/* do some stuff */
}
旁注,如果您使用 fgets()
那么您应该注意 fgets()
将 \n
存储在缓冲区的末尾。因此您可能需要将 \n
替换为 \0
,为此您可以使用 strcspn()
或手动执行此操作。
编辑:请注意,stdin
流是行缓冲的,即在 scanf("%[^\n]",name);
new 之后行字符 \n
保留在 stdin
流中,如果您第二次再次扫描数据,则可能会因未在 name
中存储任何内容而失败,并且可能会失败调用未定义的行为。因此,首先检查 scanf()
的返回值。
关于c - scanf ("%[^\n]s")对于普通变量可以正常工作,但对于 C 中的结构变量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51000200/