【发布时间】:2018-10-11 05:44:13
【问题描述】:
在 main 中,我将一个字符串传递给一个不同的函数,该函数应该分隔字符串,然后处理每个子字符串。在这种情况下,我需要取一个 30 个字符的字符串并将其分成长度为 7、5、5、7 和 6 的子字符串,以便稍后进行操作。这是我开始尝试的:
void breakString(const char *lineStr) {
char a[7] = " "; //I tried with them all initialized empty and without doing so.
char b[5]; //Didn't seem to make a difference.
char c[5];
char d[7];
char e[6];
//sscanf(lineStr, "%7s", &a); //tried sscanf at first, but didn't know how to
strncpy(a, lineStr, 7); //scan the middle so i switched to strncpy
strncpy(b, lineStr + 7, 5);
//continue this pattern for c,d,e
(rest of function here, where each substring is manipulated accordingly.)
我通过打印子字符串a 和b(以及strcmp() 将它们打印到正确的输出)测试了第一位,但它不能完全工作。我一直在胡言乱语。例如,如果传递的完整字符串是"abcdefghijklmnopqrstuvwxyz1234",那么a 应该是"abcdefg",b 应该是"hijkl",等等。但是,当我打印a 时,它会显示为"abcdefg^#@%^&",每个子字符串后面都有一些随机的字符。
我做错了什么?还是有更好的方法来实现这一点?
【问题讨论】:
-
strncpy 不会空终止,所以你看到的是溢出。解释见randomascii.wordpress.com/2013/04/03/stop-using-strncpy-already
-
C 中的字符串末尾有一个零字节。如果你有一个像
a[7]这样的数组,而你是strncpy(a, lineStr, 7),你得到的是一个字符数组。它不是字符串,因为它末尾没有零字节。所以你不能把它传递给像strcmp这样的字符串函数,你也不能用一个简单的%s格式说明符来打印它。您可以使用%.7s打印它 -
strncpy是邪恶的。始终使用strlcpy。如果它在您的系统上不可用,请自行查找源并使其可用。strncpy不是也从未用于复制字符串,这与它的名字所暗示的相反。
标签: c arrays string parsing strncpy