【问题标题】:copying part of the char array to a string in c将char数组的一部分复制到c中的字符串
【发布时间】:2011-05-31 22:48:46
【问题描述】:

我已经阅读了许多建议的问题,但仍然找不到答案。我知道缓冲区中的内容是以 NULL 结尾的char array,我想将其复制到动态分配的char array 中。但是,我不断地从 strcpy 函数中得到分段错误。感谢您的帮助。

void myFunction()
{
    char buffer[200];

    // buffer was filled by recvfrom correctly, and can be printed out with printf()
    char *message = malloc(200);

    strcpy(message, buffer[1]);
}

///////////////

好的,所以我尝试了strcpy(message, &buffer[1]); strcpy(message, buffer);,但没有任何效果!!

【问题讨论】:

  • 提高编译器的警告级别并注意警告!
  • strcpy() 的第二个参数也应该是一个[const] char *,即缓冲区。它目前是缓冲区的第二项,char
  • 所以应该是strcpy(message, &buffer[1])?
  • 写成“strcpy(message, buffer + 1)”比较惯用
  • 您的段错误现在是由不同的东西引起的。并非所有的段错误都是一样的。我更新了答案以在缓冲区中包含一个终止的空字节(最有可能导致程序崩溃的候选者)。如果您需要更多帮助或建议,请粘贴较大的 sn-p。

标签: c string segmentation-fault arrays


【解决方案1】:

这对我有用。您的缓冲区可能不是以空值结尾的吗?

char buffer[200];
buffer[0] = 'h';
buffer[1] = 'e';
buffer[2] = 'l';
buffer[3] = 'l';
buffer[4] = 'o';
buffer[5] = '\0';

// buffer was filled by recvfrom correctly, and can be printed out with printf()
char *message = (char *)malloc(200);
strcpy(message, buffer);

【讨论】:

  • 我可以做 printf("message is: %s", buffer);它正确打印出我使用 sendto 发送的消息。我确定缓冲区包含正确的 c 字符串
【解决方案2】:

您对strcpy(3) 的调用不正确。将其更改为以下内容:

    buffer[199] = '\0';
    strcpy(message, &buffer[1]);

strcpy(3) 具有以下签名:

 char *
 stpcpy(char *s1, const char *s2);

你通过了:

 char *stpcpy(char *s1, const char s2); /* won't work */

我建议使用memcpy(3) 而不是strcpy(3),因为strcpy(3) 依赖于空字符来终止字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-11
    • 2017-03-11
    • 2022-01-13
    • 1970-01-01
    • 2012-10-11
    相关资源
    最近更新 更多