【问题标题】:Why is the last char being cut from the string?为什么从字符串中删除最后一个字符?
【发布时间】:2013-12-05 11:09:25
【问题描述】:

为什么要从下面的字符串中截取最后一个字符?

char *data[10];
char napis[] = "Witam";

data[0] = (char*) malloc (sizeof(char) * strlen(napis+1));

strncpy(data[0], napis, strlen(napis+1));
data[0][strlen(napis+1)] = '\0';

printf("%s\n", data[0]);

似乎一切都应该没问题,但程序返回少一个字符(最后一个)。

返回“Wita”而不是“Witam”。

【问题讨论】:

  • 除了+1 放置不当的错误之外,您的代码中还有另一个奇怪的地方。出于某种原因,您使用了strncpy 函数,该函数并非真正用于复制以零结尾的字符串。您要求它复制strlen(napis)+1 个字符。事实上,strncpy 将在源字符串中的最后一个\0 处停止(即它只会复制strlen(napis) 字符),然后用零填充目标缓冲区的其余部分。最终结果当然是正确的,但是为此使用strncpy 是一件相当奇怪的事情。你为什么不直接使用strcpy
  • 因为您确切知道要复制多少个字符,所以即使是memcpy 也会是更好的选择。但是strncpy???
  • 请注意您的data[strlen(napis)+1] = '\0'; 是一个重大错误。它写入超出数组边界(这个错误仍然存​​在于接受的答案中)。事实上,您根本不需要它,因为在这种特定情况下,strncpy 将正确终止字符串。

标签: c arrays char


【解决方案1】:

strlen(napis+1) 执行指针增量,以便计算 chararray 'itam\0' 的长度。

要将 1 加到 char 的长度上,执行 strlen(napis)+1 是正确的。

char *data[10];
char napis[] = "Witam";

data[0] = (char*) malloc (sizeof(char) * (strlen(napis)+1));

strncpy(data[0], napis, strlen(napis)+1);
data[strlen(napis)+1] = '\0';

printf("%s\n", data[0]);

【讨论】:

  • 这个data[strlen(napis)+1] = '\0';实际上是错误的。你写的超出了数组的末尾。实际上,data[strlen(napis)+1] = '\0'; 是完全没有必要的。 strncpy 保证在这种特定情况下添加正确的零终止符。但在一般情况下,使用strncpy 进行零终止字符串复制是对功能的滥用,存在完全不同的目的。
猜你喜欢
  • 2017-08-19
  • 1970-01-01
  • 2023-01-21
  • 2011-01-19
  • 2021-12-11
  • 2010-11-08
相关资源
最近更新 更多