【问题标题】:scanf three times in c doesn`t work?在c中scanf三次不起作用?
【发布时间】:2015-04-28 16:36:34
【问题描述】:

你好,我有一个学校的作业,要编写一个程序来查找一个单词并将其替换为文本中的另一个单词。直到现在我还没有完成 char 字符串,我有一个小问题。我需要扫描文本、查找词和替换词,但只有文本 scanf 工作,其他只是跳过..

 char w[10000];
char find[10000];
char replace[10000];
int l,c,b,diff,i,k,yes=0,vm;
printf("Text: ");scanf("%[^\n]s",w);
printf("\nFind: ");scanf("%[^\n]s", find);
printf("\nReplace: ");scanf("%[^\n]s", replace);

如果您能说出为什么查找和替换的 scanf 会跳过,我将非常感谢。

抱歉英语不好,不是我的母语。

【问题讨论】:

  • 您需要消耗缓冲区中的换行符,由scanf("%[^\n]%*c",w);完成
  • 注意[^\n] 一个转换说明符,它不是s说明符的修饰符。此外,请始终检查来自scanf() 的返回值。
  • 如果用户仅输入 '\n'@gopi scanf("%[^\n]%*c",w) 扫描 nothingw 仍未初始化,'\n 仍保留在 stdin 中,可能会导致关注 scanf() 时出现类似问题。
  • @chux 我从不采用 scanf() 方式来读取字符串,如果 OP 已经采用了这条路径,我说这可以做到.. 请看看我在下面的回答,我说 @987654333 @很好
  • @Gopi 答案对用户fgets() 的建议很好,但上述评论和this answer 都建议使用当用户仅输入'\n' 时无法正常工作的格式。 scanf() 的替代代码可以解决这个问题。

标签: c arrays string char scanf


【解决方案1】:

试试这个

printf("Text: ");scanf("%[^\n]%*c",w);
printf("\nFind: ");scanf("%[^\n]%*c", find);
printf("\nReplace: ");scanf("%[^\n]%*c", replace);

只需使用换行符并在 [^\n] 之后去掉 s

读取直到遇到换行符


我建议你使用

fgets(w,sizeof(w),stdin);

这样更安全。

【讨论】:

  • @BorisMutafov,因为这个答案对你有帮助,你能否考虑accepting it 并检查你的其他问题,看看你是否可以接受其中一些答案?您可以通过单击左侧箭头下方的复选标记来接受答案。接受答案告诉社区该解决方案有效。它还会奖励您和回答您问题的人一些声誉。您没有义务这样做,但这是一种很好的做法。
【解决方案2】:

scanf("%[^\n]s",w);有多个问题:

  1. 不需要s"%[^\n]" 是一个完整的格式说明符。 @unwind

  2. 没有输入限制。可以用来应对限制:char w[10000]; scanf("%9999[^\n]", w);

  3. 格式不消耗任何东西是用户输入Enterw 保持未初始化状态,'\n' 保持在 stdin 中,下一个 scanf() 执行相同操作。

    // NOT recommended
    scanf("%[^\n]%*c", w); This gets stuck on \n only input
    
  4. scanf("%[^\n]",w); 中的任何内容都不会消耗典型的尾随 '\n'。代码可以使用以下代码来检查 scanf() 结果。

    if (scanf("%9999[^\n]", w) != 1) Handle_EOForEOLonlyInput();
    fgetc(stdin);
    

建议改为fgets()

char w[10000];
if (fgets(w, sizeof w, stdin) == NULL) Handle_EOForIOError();
// strip possible ending EOL if needed.
w[strcspn(w, "\n")] = 0;

【讨论】:

    【解决方案3】:

    这应该可行,因为 scanf 应该跳过前导空格,包括换行符。

    char w[10000];
    char find[10000];
    char replace[10000];
        /* ... */
        printf("Text: ");scanf("%s",w);
        printf("\nFind: ");scanf("%s", find);
        printf("\nReplace: ");scanf("%s", replace);
    

    【讨论】:

      猜你喜欢
      • 2016-03-07
      • 2015-02-23
      • 2014-11-10
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多