今天我正在搞乱所有的字符串函数,虽然大多数工作都按预期工作,特别是因为我不再尝试修改文字(叹息),有一个警告和奇怪我不能似乎要解决。
#include <stdio.h>
#include <string.h>
int main() {
char array[] = "Longword";
char *string = "Short";
strcpy(array, string); // Short
strcat(array, " "); // Short (with whitespace)
strcat(array, string); // Short Short
strtok(array, " "); // Short
if (strcmp(array, string) == 0)
{
printf("They are the same!\n");
}
char *substring = "or";
if (strstr(array, substring) != NULL)
{
printf("There's a needle in there somewhere!\n");
char *needle = strstr(array, substring);
int len = strlen(needle);
needle[len] = "\0"; // <------------------------------------------------
printf("Found it! There ya go: %s",needle);
}
printf("%s\n", array);
return 0;
}
随意忽略前几个操作 - 我把它们留下来因为它们以某种方式修改了数组,这使得strstr函数开始变得有用。
问题的关键是第二个if语句,第32行,如果你要在编辑器中复制它。 (编辑:添加了箭头。对不起!)
答案 0 :(得分:4)
这一行错了:
needle[len] = "\0";
Doublequotes创建一个字符串文字,其类型为char *
。但needle[len]
是char
。要制作char
文字,请使用单引号:
needle[len] = '\0';
答案 1 :(得分:2)
你的第二个strcat
调用超过了array
的结尾,破坏了内存中发生的任何事情。一旦发生这种情况,后面的代码可能会做任何事情,这就是为什么写一个数组的末尾是未定义的行为