【问题标题】:"integer from pointer without cast" when adding nullbyte to pointer将空字节添加到指针时“来自指针的整数”
【发布时间】: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 末尾之后。)

标签: c string pointers strlen


【解决方案1】:

这一行是错误的:

needle[len] = "\0";

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

needle[len] = '\0';

Single quotes vs. double quotes in C or C++

【讨论】:

  • 感谢您的快速回答!想想就这么容易。我现在从语句中得到的输出是ortShort。那是因为我破坏了原始数组吗?我可以通过增大原件的尺寸来解决它吗?
  • 很有可能。试试char array[100] = "Longword";
【解决方案2】:

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

【讨论】:

  • 这不会导致标题中的编译器警告。
  • @Barmar:真实但无关紧要。
  • 感谢您的回答,这就是为什么现在的输出是“ortShort”而不是“or”?
  • 绝对相关。修复此问题不会消除他询问的编译器警告。
猜你喜欢
  • 1970-01-01
  • 2018-04-10
  • 2016-03-27
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多