将一个字符串溢出一半并将其与另一个字符串

时间:2015-11-04 08:10:22

标签: c string split

我想问我是否有字符串" abcdefgh"而且我希望将它变成“#ab;"和" efgh"并将其存储在自己的字符串中,我称之为" UpperHalf"和" LowerHalf"。所以这样做的方法是首先使用strlen()找出输入的长度和一半?然后我需要使用strcpy()并将其复制到各自的字符串对吗?

实际上,我甚至不知道我的代码是否有意义。有人可以给我一些评论吗?

我意识到我只需要考虑输入数字,这意味着我不需要担心奇数输入。以前我试图将一个1d的字符串溢出一半,然后用其他东西来str it它。但现在我得到了一系列以2d数组格式存储的输入字符串。在这种情况下,我如何检索这些字符串并操纵它们,就好像它与前一个案例相同?我不认为我需要使用for循环?我可以指向那一行吗?

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]);

3 个答案:

答案 0 :(得分:1)

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

查看您的代码,我建议不要使用临时字符串。您可以直接从原始' 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字符时至少留下一个字符)。

答案 1 :(得分:0)

是的,您必须首先使用strlen来获取输入字符串的长度,并将其减半以得到upper_half的长度:

size_t length = strlen(str);
size_t upper_length = length / 2;
size_t lower_length = length - upper_length;

在这种情况下,如果输入字符串的长度是奇数,那么由于整数除法,upper_length将等于lower_length - 1,例如:

length == 3
upper_length == 3 / 2 == 1
lower_length == 3 - 1 == 2

在不修改原始字符串的情况下进行实际复制比较容易,就像你的代码一样。

您必须分配空间来存储半字符串的副本,并使用空终止符:

char *upper_half = malloc(upper_length + 1);
char *lower_half = malloc(lower_length + 1);

然后使用memcpy复制字符串数据:

memcpy(upper_half, &str[0], upper_length);
upper_half[upper_length] = '\0';

(同样适用于lower_half。)

strcpy将字符复制到空字节,而memcpy复制给定的字节数。

答案 2 :(得分:0)

虽然可以使用所有标准函数将下半部/上半部复制到单独的字符串,但您也可以仅使用指针和单独的缓冲区来分割字符串以保存字符串的下半部分。

基本上,你可以找到字符串的长度,调整中点的奇数/偶数位置(如果需要总是但下半部分的奇数长度上的附加字符),然后使用简单的循环来复制到下半部分。在循环结束时,使用的指针指向上半部分(或者您可以简单地使用指针作为中点的位置)。一个简短的例子是:

#include <stdio.h>

#define MAXC 64

int main (int argc, char **argv) {

    if (argc < 2 ) {
        fprintf (stderr, "error: insufficient input, usage: %s string\n",
                argv[0]);
        return 1;
    }

    char lower_half[MAXC] = {0};    /* array to hold lower_half */
    char *p = argv[1];              /* poiter to string         */
    char *pl = lower_half;          /* pointer to lower_half    */
    char *split = NULL;             /* pointer to split point   */
    size_t len = 0;                 /* string length            */

    for (; *p; p++);        /* find end of string   */
    len = p - argv[1];      /* get string length    */
    p = argv[1];            /* reset pointer        */
    split = p + len/2;      /* set split at middle  */
    if (len & 1) split++;   /* if odd, add 1        */

    for (; p < split; p++)  /* for each ch < split  */
        *pl++ = *p;         /* copy to lower_half   */
    *pl = 0;                /* null-terminate       */

    /* print results */
    printf ("\n lower_half : '%s'    upper_half : '%s'\n",
            lower_half, split);

    return 0;
}

<强>输出

$ ./bin/str_half 123456789

 lower_half : '12345'    upper_half : '6789'

$ ./bin/str_half 1234567890

 lower_half : '12345'    upper_half : '67890'

无论您是使用指针还是使用strlenstrncpymemcpy等,请确保null-terminate分隔的字符串。在上面,由于lower_half在开始时被初始化为所有0,因此不需要显式空终止。但是,最好始终确保您的代码为空终止字符串。