将nullbyte添加到指针时,“没有强制转换的指针”

时间:2016-01-14 00:23:41

标签: c string pointers strlen

今天我正在搞乱所有的字符串函数,虽然大多数工作都按预期工作,特别是因为我不再尝试修改文字(叹息),有一个警告和奇怪我不能似乎要解决。

#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行,如果你要在编辑器中复制它。 (编辑:添加了箭头。对不起!)

2 个答案:

答案 0 :(得分:4)

这一行错了:

needle[len] = "\0";

Doublequotes创建一个字符串文字,其类型为char *。但needle[len]char。要制作char文字,请使用单引号:

needle[len] = '\0';

请参阅Single quotes vs. double quotes in C or C++

答案 1 :(得分:2)

你的第二个strcat调用超过了array的结尾,破坏了内存中发生的任何事情。一旦发生这种情况,后面的代码可能会做任何事情,这就是为什么写一个数组的末尾是未定义的行为