"integer from pointer without cast" 向指针添加空字节时
"integer from pointer without cast" when adding nullbyte to pointer
我今天在搞乱所有的字符串函数,虽然大多数都按预期工作,特别是因为我停止尝试修改文字(叹气),有一个警告和我似乎无法解决的问题。
#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] = "[=11=]"; // <------------------------------------------------
printf("Found it! There ya go: %s",needle);
}
printf("%s\n", array);
return 0;
}
请随意忽略前几个操作 - 我将它们留在原处是因为它们以某种方式修改了数组,这使得 strstr 函数在开始时很有用。
问题是第二个 if 语句,第 32 行,如果您要在编辑器中复制它。
(编辑:在行中添加了箭头。抱歉!)
您的第二个 strcat
调用超出了 array
的末尾,破坏了内存中它之后的任何内容。一旦发生这种情况,后面的代码可能会做任何事情,这就是为什么写超过数组末尾是未定义的行为
这一行是错误的:
needle[len] = "[=10=]";
双引号构成一个字符串文字,其类型为char *
。但是 needle[len]
是一个 char
。要制作 char
文字,您可以使用单引号:
needle[len] = '[=11=]';
见Single quotes vs. double quotes in C or C++
我今天在搞乱所有的字符串函数,虽然大多数都按预期工作,特别是因为我停止尝试修改文字(叹气),有一个警告和我似乎无法解决的问题。
#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] = "[=11=]"; // <------------------------------------------------
printf("Found it! There ya go: %s",needle);
}
printf("%s\n", array);
return 0;
}
请随意忽略前几个操作 - 我将它们留在原处是因为它们以某种方式修改了数组,这使得 strstr 函数在开始时很有用。
问题是第二个 if 语句,第 32 行,如果您要在编辑器中复制它。 (编辑:在行中添加了箭头。抱歉!)
您的第二个 strcat
调用超出了 array
的末尾,破坏了内存中它之后的任何内容。一旦发生这种情况,后面的代码可能会做任何事情,这就是为什么写超过数组末尾是未定义的行为
这一行是错误的:
needle[len] = "[=10=]";
双引号构成一个字符串文字,其类型为char *
。但是 needle[len]
是一个 char
。要制作 char
文字,您可以使用单引号:
needle[len] = '[=11=]';
见Single quotes vs. double quotes in C or C++