代码之家  ›  专栏  ›  技术社区  ›  sgerbhctim

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

c
  •  -5
  • sgerbhctim  · 技术社区  · 7 年前

    #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]);
                            }
                    }
    
            }
    }
    

    我正在努力完成提供给我的一些测试用例。例如,我的代码在此测试用例中中断:

    • 输入:/程序AABCCCCGGEEECCCD
    • 预期:a2b1c6g2e3c5d1
    • 输出:a2b1c11d1e3g2

    关于如何解决这个问题,有什么建议吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   ikegami    7 年前
    #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
    
        2
  •  -1
  •   ikegami    7 年前

    代码甚至没有编译,因为它有两个错误。主要的一点是定义了esdigit函数,但提到这个过程的是ctype( #include <ctype.h> ),不包括在内。

    另一个错误是声明了变量x,但没有使用

    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>
    
    int main(int argc, char **argv) {
        if (argc != 2) {
            fprintf(stderr, "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;
        size_t compCount = 0;
        for (i = 0 ; i != 256 ; i++) {
            if (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]);
                }
            }
        }
    
        printf("\n");
    
        return 0;
    }