我尝试使用此代码来读取名为数据包的结构,其中包括priority(int),qty(float)和message(一个句子)。
for(i = 0; i < 3; i++) {
scanf("%d%f", &packet[i].priority, &packet[i].qty);
gets(packet[i].message);
printf("n%d %.6f ", packet[i].priority, packet[i].qty);
printf("%sn", packet[i].message);
}
问题是我希望它打印如下内容:
1 1 MESSAGE NUMBER ONE
2 1 MESSAGE NUM TWO
3 4 MESS NO THREE
但相反,它打印
1 1
0 0 MESSAGE NUMBER ONE
2 1
就像 gets() 在需要时不执行,而是将"for"延迟一步。有什么想法吗?
首先也是最重要的:为什么get函数如此危险以至于不应该使用它?这应该可以消除使用 get 时的一些混淆以及为什么不应该使用它。
scanf
会在输入缓冲区中留下一个行终止符nr
,因此当您开始使用gets()
时,它将拾取行终止符。所以回想起来,for 循环没有"延迟",gets()
消耗行终止符,并且会在下一行发生时拾取下一行并将其分配给message
。
您可以尝试将message
定义为要读入的字符数组。
struct placeholder
{
char message[25]; // Able to hold a message of length 24.
// rest of your struct variables.
}PlaceHolder;
// using scanf is still appropriate for reading in the message
要阅读消息,您需要使用换行符 - 查看此内容以获取更多帮助: scanf:"%[^]"跳过第二个输入,但" %[^]"不会。 为什么?
为了调试,我建议您在 printf 输出中包含单引号。 您有足够的组合 scanf 、get 和 printf 语句,并不总是清楚输入和输出中的起点(如您在问题中所示)。
printf("n(d %d) (f %.6f) (s %s)n, packet[i].priority, packet[i].qty, packet[i].message);
将大大帮助您确定正在打印的内容以及位置,因为输出很容易看起来像
(d 0) (f 0) (s
)
如果没有额外的字符,您很容易将换行符输出混淆为非常接近的输入例程中的错误。
试试这个
scanf("%d%f %[^n]", &packet[i].priority, &packet[i].qty,
packet[i].message);
printf("n%d %.6f ", packet[i].priority, packet[i].qty);
printf("%sn", packet[i].message);