【发布时间】:2016-01-14 00:23:40
【问题描述】:
我今天搞乱了所有的字符串函数,虽然大多数都按预期工作,尤其是因为我停止尝试修改文字 (sigh),但有一个警告和奇怪我不能似乎解决了。
#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 行,如果您要在编辑器中复制它。 (编辑:在行中添加了箭头。对此感到抱歉!)
【问题讨论】:
-
不要把我们都算在内,这是第 32 行?
-
needle指向array[]的某个偏移量,array[]已被 strcat() 函数终止为 NUL,因此完全不需要这一行:needle[len] = "\0";。 -
请随意忽略前几个操作 抱歉,不能这样做。这一行:
strcat(array, string);正在尝试将字符串附加到数组上,导致未定义的行为,因为数组 [] 溢出可能导致 seg 错误事件。 -
为什么要调用
strstr()两次,只是保存第一次调用的结果。类似于:if ( (char* needle = strstr(array, substring) ) != NULL) -
正如 user3629249 所暗示的,在更正 '\0' 字符后,您的代码
int len = strlen(needle); needle[len] = '\0';并没有按照您的想法执行。strlen(needle)not 返回子字符串的长度(如您所愿)。needle指向array中的“ort”,因此strlen(needle)返回 3,而不是您想要的 2,并且您只是将 NUL 字符存储在array中已经存在的位置。使用needle[strlen(substring)] = '\0';对array中的子字符串进行NUL 终止。 (并修复其他问题,尤其是strcat()写在array末尾之后。)