c - 将一个字符串分成两半并将其与另一个字符串连接

标签 c string split

我想问如果说我有一个字符串“abcdefgh”我想把它减半变成“abcd”和“efgh”并将它存储到他们自己的字符串中说我称之为“UpperHalf”和“LowerHalf”。所以这样做的方法是首先使用 strlen() 找出我输入的长度并将其减半?那么我需要使用 strcpy() 并将其复制到各自的字符串中吗?

实际上我什至不知道我的代码是否有意义。任何人都可以给我一些意见吗?

我意识到我只需要考虑偶数输入,这意味着我不需要担心奇数输入。以前我试图将 1d 字符串分成两半,然后用其他东西对其进行 strcat。但是现在我得到了一系列以二维数组格式存储的输入字符串。在这种情况下,我如何检索这些字符串并像以前的 1d 情况一样操作它们?我不认为我需要使用循环?我可以只指向该行吗?

int d = strlen(str); // just an example where str = the characters inside my string
strcpy(temp, &str[0]); // store original string into a temp string starting from 0 to \0
str[d/2] = '\0';
strcpy(UpperHalf, &str[0]); // starts copying from position 0 to \0 which is the half way point
str[0] = temp;  //revert back to normal -> Does this line even make sense?
strcpy(LowerHalf, &str[d/2]);

最佳答案

是的,您肯定需要考虑奇数字符串长度。有一些代码方法可以将它向上或向下舍入(这样第一个或第二个字符串将具有额外的字符)但你需要决定你想要它走哪条路。

查看您的代码,我建议不需要使用临时字符串。您可以直接从原始“str”复制并节省内存和处理器开销。需要进行一些更改: 目前,您正在用 '\0' 字符覆盖源字符串中的一个字符,而您的第二个 strcpy 从那个 '\0' 开始,它将返回一个零长度的字符串。 要复制固定数量的字符,您可以使用 strncpy,它在这里比 strcpy 更有效,因为它可以简化您的代码并保持清晰。 不要忘记用\0 终止您的字符串,或者您可以像我在这里那样用 0 值初始化缓冲区。

所以,一个例子可能是这样的:

char UpperHalf[MAX_LENGTH];
char LowerHalf[MAX_LENGTH];

int l = strlen(str);
int half = l / 2;
memset(LowerHalf, '\0', MAX_LENGTH);
strncpy(LowerHalf, str, half);
memset(UpperHalf, '\0', MAX_LENGTH);
strncpy(UpperHalf, str + half, l - half);

这会将奇数长度字符串的较长部分放入 UpperHalf 字符数组。 为了确保代码安全,您还应该考虑进行长度比较,以确保所有字符串都适合提供的缓冲区(至少有一个字符留给终止\0 字符的字符串)。

关于c - 将一个字符串分成两半并将其与另一个字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33516723/

相关文章:

c - 如何查看一个detached属性的线程退出后是否释放了系统资源?

python - 如何洗牌并将大列表拆分为较小的列表,以最大限度地提高速度?

php - 按最后一个字符拆分字符串并保存到数组?

Java 分割字符串的空部分

c - 使用 socket() 时出现 mudflap 错误

c++ - Clang - 链接时为 "symbol not found"

c - 来自C文件的输入

javascript - 将此数据集中的值从字符串转换为 int 的最佳方法是什么

c - 仅将字符数组的第一个元素传递给函数 C++

c - 在 sscanf 中指定可变字段宽度