c - scanf ("%[^\n]s")对于普通变量可以正常工作,但对于 C 中的结构变量不起作用

标签 c structure scanf

我正在使用 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/

相关文章:

Visual Studio 2017 中的 c scanf_s 不能多次工作

c - 根据现在的时间运行 func()

python - 在 Python 中使用 ctypes 返回结构

c - c中嵌套结构的内存布局

c - 遇到 "\n"和 scanf 问题

c - sscanf 显示随机字符

c - 相当于Arduino millis()

c - 使用的 do while 循环如何提供用户提示?

c - 返回从 volatiles 标量初始化的字符串表现得很奇怪?

php - 网站结构