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