c语言 - 阅读句子会导致"for"延迟一步?



我尝试使用此代码来读取名为数据包的结构,其中包括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);

最新更新