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

时间:2017-12-27 03:08:20

标签: c linux

我有一个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;
}

2 个答案:

答案 0 :(得分:5)

你知道你想要(length - 1) / 5个连字符。因此,对于buf,您需要存储buf[len + (len -1) / 5 + 1];个字符。然后简单地循环遍历str中的字符和i = 0除非<{em}} 复制除{<1>} 以外的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]

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

答案 1 :(得分: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;
}