如何在c程序的末尾为字符串添加数字?

时间:2014-09-08 18:20:25

标签: c

我需要编写一个函数,它将字符串作为输入并输出如下

input : aaabbdd
output : a3b2d2

input : aaaaaaaaaaaaaaaabbccc
output : a16b2c3

基本上我必须将计数附加到每个角色。我不应该使用itoa()将int转换为字符串

我写了逻辑。但我很惊讶将数字附加到字符串上。例如,如果count为16,我如何将数字16添加到字符串的结尾?

我的逻辑如下所示。

#include <stdio.h>

void str1(char *str)
{
    int i, j, cnt;

    int len = strlen(str);

    char *nstr = (char *) malloc(len * sizeof(char));

    int k = 0;
    cnt = 1;

    for(i = 0, j = 1; i < len - 1;)
    {
        if(str[i] == str[j])
        {
            j++;
            cnt++;
            continue;
        }
        else
        {
            if(cnt == 1)
            {
                nstr[k++] = str[i];
            }
            else
            {
                nstr[k++] = str[i];
                nstr[k++] = cnt; // GOT STUCK HERE
            }
            i = j;
            j = i + 1;
            cnt = 1;
        }
    }

    printf("\n%s\n", nstr);
}

main()
{
    char str[] = "aaaaaaaaaaaaaaaabbcdd";

    str1(str);
}

2 个答案:

答案 0 :(得分:1)

您可以自己实施itoa。逻辑如下:

  • 如果数字为零,则追加零(在您的情况下,这应该永远不会发生,但一般情况下这显然是可能的)
  • 为输出准备一个临时缓冲区。大小取决于您正在打印的整数中的位数
  • 通过计算n % 10
  • 存储最后一位数字
  • 使用整数除法将数字除以10
  • 继续最后三步,直到剩余部分为零
  • 将反向的数字序列从临时缓冲区附加到输出

这只是实现逻辑的一种方式。其他方式也是可能的 - 例如,您可以构建一个10的幂的查找表,并使用整数除法和余数的组合计算每个数字。

答案 1 :(得分:1)

您需要的所有代码,用评论装饰:

if (len == 0) return;

/* initialize */
char c = str[0];
int  count = 1;

/* include terminating '\0', and that will resolve itself! */
for (i = 1; i <= len; i++)
{
   if (str[i] == str[i-1])
   {
      /* continue sequence */
      count++;
   }
   else
   {
      /* end sequence */
      printf("%c%d", c, count);
      /* start new sequence */
      c = str[i]; count = 1;
   }
}
printf("\n"); /* flush buffer */