在 c 中 scanf 三次不起作用?

scanf three times in c doesn`t work?

你好,我有一个学校的作业,要编写一个程序来查找文本中的单词并将其替换为另一个单词。直到现在我还没有完成 char string,我遇到了一个小问题。我需要扫描文本、查找词和替换词,但只有文本 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 只是跳过,我将非常感激。

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

试试这个

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

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

Read till newline character is encountered


我建议你使用

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

哪个更安全

这应该可行,因为 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);

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;