【问题标题】:Why does my code keep printing twice? I don't understand the problem [duplicate]为什么我的代码一直打印两次?我不明白这个问题[重复]
【发布时间】:2020-01-23 16:57:32
【问题描述】:
#include <stdio.h>

#define MAX_STRING_LENGTH 1024

int main(){ 

char input_name_string[MAX_STRING_LENGTH+1],motive_string[MAX_STRING_LENGTH+1];
printf("What is your name?\n");
scanf("%1024s",input_name_string);
printf("your name is %s \n", input_name_string);
printf("What is your motive?\n");
scanf(" %1024s",motive_string);
printf("your motive is %s \n", motive_string);
return 0; }

所以我为学校的一个项目编写了这个简单的程序,以尝试了解 scanf 和 printf 的工作原理。由于某种原因,当它运行时,它会在一行上打印每个字符串中的第一个单词,然后在另一行上打印第二个单词。我不明白为什么会这样?我没有 C 方面的经验,但我的代码中的逻辑似乎是正确的?任何建议

【问题讨论】:

  • scanf 永远不应该用于交互式输入。
  • @kaz 你所说的交互式输入是什么意思? scanf 解决了哪些具体用例?
  • 交互式输入是终端 - 您从键盘输入程序的所有内容。如果它是通过管道传输的,则将是非交互式的。例如$ cat .profile | my_processing_prog。然后你可以使用 scanf() 作为cat 标准输出是my_processing_prog 标准输入。
  • @TruthSeeker scanf 用于扫描预先为机器准备的格式化输入。例如,在文件中准备的格式化数据,或来自其他程序。交互输入是指用户与程序交互。当输入不正确时,流将处于意外状态,很难以任何用户友好的方式从中恢复。特别是,任何与失败的scanf 不匹配的多余字符都会留在流中并混淆后续的scanf 调用。接受用户输入的程序必须更加宽容。
  • @TruthSeeker K&R2 的书说:"scanf 忽略其格式字符串中的空格和制表符。此外,它会跳过空格(空格、制表符、换行符等)它查找输入值。要读取格式不固定的输入,通常最好一次读取一行,然后用sscanf 将其分开。"

标签: c printf scanf


【解决方案1】:

带有您使用的转换格式说明符的函数scanf 读取字符,直到遇到空白字符。

改为使用函数fgets。

例如

fgets( input_name_string, sizeof( input_name_string ), stdin );

该函数还可以将换行符附加到输入的字符串中。要删除它,您可以编写

#include <string.h>

/ …

input_name_string[ strcspn( input_name_string, "\n" ) ] = '\0';

至于你的格式说明符

scanf("%1024s",input_name_string); 

无论如何它都是不正确的。而不是 1024,因为字段宽度应该比字符数组的大小小一,以便为终止零字符 '\0' 保留一个字符。

你可以写

scanf( "%1023[^\n]\n", input_name_string );

【讨论】:

  • 实际上它回答了“如何做才能使它工作”的问题,并且做得对,但不是为什么。
  • @tansy 再读一遍答案,尤其是第一句话。
  • 我看到了,但仍然没有看到答案,为什么是(“概念上”)scanf("%s", "Aaa Bbb"); 将"Bbb" 写入motive_string(从输出中看就是这样)。
  • @tansy 首先,您致电显示的内容不正确,然后再阅读我回答的第一个陈述。
  • 更正了之前的评论 - 我的意思是输入是“Aaa Bbb”,它将“跳转”到第二个 printf() 并打印“Bbb”。
猜你喜欢
  • 2014-04-11
  • 2022-12-08
  • 2022-06-10
  • 2022-08-08
  • 2012-03-23
  • 2023-04-02
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多