多个字符数组的输入不起作用

Input of multiple char arrays isn't working

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 是一个全局字符数组

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

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);
      ^^^^

在这种情况下,将跳过所有前导白色 space 字符。

这是一个演示程序。

#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

您的scanf()用法有问题:scanf("%[^\n]", str);

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

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

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

  • 但是请注意,如果用户立即输入 enter,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")] = '[=10=]'; /* 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")] = '[=10=]'; /* 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")] = '[=10=]'; /* strip the trailing newline if any */
pos = strnfnd(0, toFind);
strins(pos, replace);
printf("Der Text ist: %s\n", str);