在 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^#@%^&"
的形式出现,每个子字符串后面都有一些随机字符组合。
我做错了什么?或者是否有更好的方法以不同方式实现这一点?
最佳答案
I keep getting extra gibberish...
这是因为如果源长于传递的大小,strncpy()
不会在目标末尾隐式附加空字符。在 C 语言中,字符串是一个以 null 结尾的字符数组。
因此,在此之后:
strncpy(a, lineStr, 7);
如果源文件的长度超过传递的大小,那么您需要在末尾添加空字符,如下所示:
a[7] = '\0';
缓冲区大小应为 +1 以容纳缓冲区末尾的空字符:
char a[8];
char b[6];
char c[6];
char d[8];
char e[7];
您应该尽量避免使用 strncpy()
,因为您需要手动处理附加空字符的问题。取而代之的是,使用保证始终以 null 终止目标的东西,例如 snprintf()
。你可以这样做:
char a[8];
snprintf(a, 8, "%s", lineStr);
您不需要附加终止空字符,它会自动附加在写入的内容之后。阅读有关 snprintf()
的更多信息 here .
附加:
您尝试初始化空数组的方式不正确:
char a[7] = " ";
这不是空数组,但实际上会用空格字符初始化数组 (a[0])
的第一个元素,其余元素将用 0< 初始化
。要初始化空数组,您可以这样做:
char a[8] = {0};
这将用 0
初始化数组的所有元素。
关于c - 如何在 C 中将一个字符串分成多个其他特定长度的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50112205/