c - 如何在 C 中将一个字符串分成多个其他特定长度的字符串?

标签 c arrays string parsing strncpy

在 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.)

我通过打印子字符串 ab(以及通过 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/

相关文章:

c++ - 在 Windows 中创建和移动超过 260 个字符的路径名的程序

将 char 数组的值复制到二维数组

c - 第二次 fgets 后出现段错误

arrays - 如何将所有 CLlocations\CLLocationCooperative2D 保存到数组中

c++回文程序使用数组

string - 如何测试字符串是否按顺序包含模式中的每个字符?

javascript - .NET MVC/Javascript 从动态 HTML 转义单引号

使用 C 的编译器选项捕获浮点异常

java - 搜索数组中的单词

javascript - 从数组中提取特定信息