如何重新格式化代码以正确输出?

时间:2017-10-02 17:55:00

标签: c

我的代码如下:

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

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

        if (argc != 2) {
                printf("error\n");
                return -1;
        }
        char *ptr = argv[1];
        int count[256] = {0};
        while (*ptr) {
                if(!isdigit(*ptr)){
                        count[(unsigned char)*ptr]++;
                        ptr++;
                }
                else{
                        printf("error\n");
                        return -1;
                }
        }
        int i;
        int compCount = 0;
        for (i = 0 ; i != 256 ; i++) {
                if (count[i]) {
                //      compCount += printf("%c%d",i,count[i]);
                        compCount +=2;
                }

        }

        int j;
        if(compCount > strlen(argv[1])){
                printf("%s\n", argv[1]);
        }else{

                for(j=0; j!=256;j++){
                        if(count[j]){
                                printf("%c%d",j,count[j]);
                        }
                }

        }
}

我正在尝试处理我提供的一些测试用例。例如,我的代码在此测试用例中断:

  • INPUT:./ program aabccccccggeeecccccd
  • 预期:a2b1c6g2e3c5d1
  • 输出:a2b1c11d1e3g2

有关如何解决这个问题的任何建议吗?

2 个答案:

答案 0 :(得分:1)

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

// dst needs to at least strlen(src)*2+1 in size.
void encode(char* dst, const char* src) {
    while (1) {
       char ch = *src;
       if (!ch) {
          *dst = 0;
          return;
       }

       size_t count = 1;
       while (*(++src) == ch)
          ++count;

       *(dst++) = ch;
       dst += sprintf(dst, "%zu", count);
    }
}

int main(int argc, char** argv) {
   if (argc != 2) {
      fprintf(stderr, "usage\n");
      return 1;
   }

   const char* src = argv[1];
   char* dst = malloc(strlen(src)*2+1);
   encode(dst, src);
   printf("%s\n", dst);
   free(dst);
   return 0;
}

$ gcc -Wall -Wextra -pedantic -std=c99 -o a a.c

$ ./a aabccccccggeeecccccd
a2b1c6g2e3c5d1

$ ./a abc
a1b1c1

答案 1 :(得分:-1)

代码甚至没有编译,因为它有2个错误。主要的是esdigit函数已定义,但提到此过程的liberia(c {(= INDEX(A:A,MATCH(LARGE(((B:B>=0.9)+0)*(C:C),1),((B:B>=0.9)+0)*(C:C),0)) ))未包括在内。

另一个错误是声明了变量x但未使用

#include <ctype.h>