【发布时间】: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将正确终止字符串。