您的使用存在问题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);