在 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);
有多个问题:
不需要s
。 "%[^\n]"
是一个完整的格式说明符。 @unwind
没有输入限制。可以用来应对限制:char w[10000]; scanf("%9999[^\n]", w);
格式不消耗任何东西是用户输入Enter。 w
保持未初始化,'\n'
保持在 stdin
中,下一个 scanf()
做同样的事情。
// NOT recommended
scanf("%[^\n]%*c", w); This gets stuck on \n only input
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;
你好,我有一个学校的作业,要编写一个程序来查找文本中的单词并将其替换为另一个单词。直到现在我还没有完成 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);
有多个问题:
不需要
s
。"%[^\n]"
是一个完整的格式说明符。 @unwind没有输入限制。可以用来应对限制:
char w[10000]; scanf("%9999[^\n]", w);
格式不消耗任何东西是用户输入Enter。
w
保持未初始化,'\n'
保持在stdin
中,下一个scanf()
做同样的事情。// NOT recommended scanf("%[^\n]%*c", w); This gets stuck on \n only input
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;