2
char toFind[100];
char replace[100];
int pos = 0;
printf("Enter a text: ");
scanf("%[^\n]", str);
printf("Enter a search pattern: ");
scanf("%[^\n]", toFind);
printf("Enter a substitute: ");
scanf("%[^\n]", replace);
pos = strnfnd(0, toFind);
strins(pos, replace);
printf("Der Text ist: %s", str);

此代码示例让我读取 str 的值,但跳过其他两个 scanf。我不知道为什么。我能做些什么来解决这个问题?

ps:str是一个全局char数组

4

3 回答 3

2

在这个电话之后scanf

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

新行字符'\n'仍然存在于输入缓冲区中。

所以下一个调用scanf

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

'\n'在遇到换行符之前读取输入的内容不会读取任何内容。

你应该写例如

scanf("%[^\n]%*c", str);

'\n'从输入缓冲区中删除换行符。

这是一个演示程序

#include <stdio.h>

int main( void )
{
    char s[100];
    
    scanf( "%99[^\n]%*c", s );
    puts( s );
    
    scanf( "%99[^\n]", s );
    puts( s );

    return 0;
}

在这种情况下,如果输入字符串,例如

Hello
      World

那么输出将是

Hello
      World

另一种更简单的方法是在格式字符串前面加上一个空格。例如

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

在这种情况下,所有前导空白字符都将被跳过。

这是一个演示程序。

#include <stdio.h>

int main( void )
{
    char s[100];
    
    scanf( "%99[^\n]", s );
    puts( s );
    
    scanf( " %99[^\n]", s );
    puts( s );

    return 0;
}

在这种情况下,如果输入如上所示的字符串,则

Hello
      World

那么程序输出将是

Hello
World
于 2021-10-26T12:34:53.270 回答
0

这取决于您运行编译代码的位置 - 操作系统。在某些情况下,当按下“Enter”键时,会在输入流(10 和 13)中发出两个字节,而不是 '\n' (10)。在这种情况下,您需要刷新额外的符号。检查评论以了解确切的实现。

于 2021-10-26T11:58:07.953 回答
0

您的使用存在问题scanf()scanf("%[^\n]", str);

  • 您没有指定要存储到的最大字符数str,因此用户键入的足够长的行将导致未定义的行为。这是黑客可以尝试和利用的典型软件缺陷。您可以通过将限制指定为来防止这种情况scanf("%99[^\n]", str);

  • 您没有读取用户输入的尾随换行符,因此下一次调用scanf("%[^\n]", toFind);将失败,因为'\n'输入流中不存在与 不同的字符,因为第一个待处理字节是'\n', 或EOF

  • 您不检查scanf()调用的返回值,因此您无法检测到上述输入错误。

  • 但是请注意,scanf("%99[^\n]", str);如果用户立即输入并且str在这种情况下不会被修改,则会失败。

fgets()使用它来代替scanf()这个任务要安全得多:

char str[100];
char toFind[100];
char replace[100];
int pos = 0;
printf("Enter a text: ");
if (!fgets(str, sizeof str, stdin)) {
    printf("input error\n");
    return 1;
}
str[strcspn(str, "\n")] = '\0'; /* strip the trailing newline if any */
printf("Enter a search pattern: ");
if (!fgets(toFind, sizeof toFind, stdin)) {
    printf("input error\n");
    return 1;
}
toFind[strcspn(toFind, "\n")] = '\0'; /* strip the trailing newline if any */
printf("Enter a substitute: ");
if (!fgets(replace, sizeof replace, stdin)) {
    printf("input error\n");
    return 1;
}
replace[strcspn(replace, "\n")] = '\0'; /* strip the trailing newline if any */
pos = strnfnd(0, toFind);
strins(pos, replace);
printf("Der Text ist: %s\n", str);
于 2021-10-26T13:30:58.093 回答