使用scanf进行结构输入

使用scanf进行结构输入,c,C,这篇文章附带的代码是一个更大的程序的一部分,但我在输入结构化变量“title”和“author”时遇到了问题。 程序似乎在它上面循环,然后转到下一行。此外,在字符串说明符中使用“s”之前的[^\n]时,它也会执行相同的操作,但我认为它用于使用scanf将字符串作为输入。读了几篇文章,但没有弄清楚问题所在。 从C开始,任何帮助都将不胜感激 struct books{ char title[30]; char author[30]; char subject[20]; int quantity; i

这篇文章附带的代码是一个更大的程序的一部分,但我在输入结构化变量“title”和“author”时遇到了问题。 程序似乎在它上面循环,然后转到下一行。此外,在字符串说明符中使用“s”之前的[^\n]时,它也会执行相同的操作,但我认为它用于使用scanf将字符串作为输入。读了几篇文章,但没有弄清楚问题所在。 从C开始,任何帮助都将不胜感激

struct books{
char title[30];
char author[30];
char subject[20];
int quantity;
int book_id;
char *category;
int count;
float price;
};
struct books book;

book.book_id=id;
printf("\n\n\t\tBook Name:\n\t\t");
scanf(" %s",book.title);
printf("\n\n\t\tAuthor:\n\t\t");
scanf(" %[^\n]s",book.author);
printf("\n\n\t\tQuantity:\n\t\t");
scanf("%d",&book.quantity);
printf("\n\n\t\tPrice:\n\t\t");
scanf("%f",&book.price);

在输入“book.title”和“book.author”中的字符串说明符中,在“s”之前使用[^\n]

我用这些修改执行了你的代码。代码是正确的

您一直使用空格分隔的字符串作为书名。(如“我的奋斗”作为书名。)

但您必须了解,不能使用Scanf将空格分隔的单词作为单个字符串输入。所以程序在它上面循环并移动到下一行


要获取此类输入,您必须使用gets或fgets函数,或在字符串说明符中的“s”之前使用[^\n]。

可能是%s之前的空格。您的格式说明符是否真正包含
[^\n]
而不是
[^\n]
?你也不需要额外的空间。
[^\n]
专门指定
\n
而不是任何空白作为字符串分隔符。如果您尝试了,那么这就是您应该发布的代码。当输入不包含空格时,它是否工作?或者这也是一个问题吗?请!顺便说一句,在
[^\n]
之后的
s
是错误的,应该删除。但这不会产生任何效果,但完全是多余的。它是[^\n],如果没有间距,它将无法工作。复制、编辑帖子时,多余的空格是错误的@clifford@SyedHasan:如果你“读过”某件事;你应该发布一个链接或陈述你实际阅读的内容,因为它要么是错误的,要么是你误解了它。
[^\n
不是格式说明符的一部分,而是分隔符规范.get(book.title)实际上也是这样。在作者的标题上循环。您可以使用scanf接受带空格的字符串。请参阅现在标记为重复的答案。在字符串输入中使用scanf是否明智是另一回事。@SyedHasan:“循环”是什么意思?您的代码片段不包含循环。不要使用
get()
-更糟糕的是
scanf()
!对于标记为重复的问题,给出了使用fgets()和
scanf()
的示例。在输入“book.title”和“book.author”中的字符串说明符中使用[^\n]before's'。我通过这些修改执行了您的代码。它运行平稳。