在C中的第五个字符后插入连字符

问题描述 投票:0回答:2

我有一个char数组,我想在每五个字符后插入连字符。我尝试了以下代码,但我正在寻找更好的方法来完成这个任务,我应该使用什么字符串函数,以及如何?谢谢。 :d

#include <stdio.h>
#include <string.h>
int main()
{
    char str[]="356a192b7913b04c54574d18c28d46e6395428ab";
    char buf[50];

    sprintf(buf, "%.5s-%.5s-%.5s-%.5s-%.5s-%.5s-%.5s-%.5s",str, str+5,str+10,str+15,str+20,str+25,str+30,str+35,str+40);
    printf("%s",buf);
    return 0;
}
c linux
2个回答
2
投票

这是我为你掀起的帮手功能。它将一个字符串作为参数以及所需的连字符间距,并返回一个带有连字符的新字符串。请注意,它确保字符串末尾没有尾随连字符。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* hyphenize(const char* str, int spacing)
{
    size_t len, newlen;
    char *ptr, *buf;

    if (spacing < 1)
    {
        return NULL; // error!
    }

    len = strlen(str);
    newlen = len + (len / spacing) + 1;
    buf = (char*)malloc(newlen);
    ptr = buf;
    for (size_t x = 0; x < len; x++)
    {
        *ptr++ = str[x];
        if ((x != 0) && (x != (len - 1)) && ((x + 1) % spacing == 0))
        {
            *ptr++ = '-';
        }
    }
    *ptr = '\0';
    return buf;
}

int main()
{
    char str[] = "356a192b7913b04c54574d18c28d46e6395428ab";
    char* p = hyphenize(str, 5);
    printf("%s\n", p);
    free(p);
    return 0;
}

5
投票

你知道你想要(length - 1) / 5连字符。所以对于buf,你需要存储buf[len + (len -1) / 5 + 1];字符。然后简单地循环str中的字符和(跳过i = 0的情况),如果i % 5 == 0除了从buf复制字符之外还将连字符写入str

把它放在一起,你可以做类似的事情:

#include <stdio.h>
#include <string.h>

#define HYPHPOS 5

int main(void) {

    char str[] = "356a192b7913b04c54574d18c28d46e6395428ab";
    size_t len = strlen (str);
    char buf[len + (len -1)/ HYPHPOS + 1], *p = buf;

    for (size_t i = 0; i < len; i++) {
        if (i && i % HYPHPOS == 0)
            *p++ = '-';
        *p++ = str[i];
    }
    *p = 0;

    printf ("str : %s\nbuf : %s\n", str, buf);

    return 0;
}

您也可以简单地使用str[i]作为循环测试子句。

示例使用/输出

$ ./bin/hyphenate
str : 356a192b7913b04c54574d18c28d46e6395428ab
buf : 356a1-92b79-13b04-c5457-4d18c-28d46-e6395-428ab

仔细看看,如果您有其他问题,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.