1

最後の問題を解決しようとしていますが、解決方法がわかりません。私の仕事は、数字を並べ替えるプログラムを書くことでしたが、私たちの家庭教師は、000054667 (実際には 54667) や 345_845 (実際には 345845) のような数字を扱うプログラムについて、いくつかの追加ポイントを与えてくれました。最初の問題はすでに解決されていますが、2番目の問題を処理する方法がわかりません。したがって、私の質問は次のとおりです。私に役立つヒント/手がかりはありますか? コードも送信しています:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define NUMBER_CHUNK 13


char* getNumber(FILE* fp) 
{
    int length, c;
    int current=0;
    char *number;

    number=(char*)malloc(sizeof(char)*NUMBER_CHUNK);
    if(!number)
    {
        printf("Error while alocating memory!\n");
        return NULL;
    }

    length=NUMBER_CHUNK;

    while(!isspace(c=fgetc(fp)) && !feof(fp))
    {
        if(isdigit(c))
        {
            number[current]=c;
            current++;
            if(current>=length) 
            {
                length+=NUMBER_CHUNK;

                if((number=((char*)realloc(number,sizeof(char*)*length)))==NULL)
                {
                    free(number);
                    return NULL;
                }
            }   
        }

        else
        {
            return NULL;
        }
    }

    number[current]='\0';
    return number;
}

int compare( const void *str1, const void *str2)
{
    int value;
    char* curr1;
    char* curr2;

    curr1=*(char**)str1;
    curr2=*(char**)str2;

    while(*curr1=='0') curr1++; 
    while(*curr2=='0') curr2++;

    if(strlen(curr1) < strlen(curr2)) return -1;
    if(strlen(curr1) > strlen(curr2)) return 1;

    value=strcmp(curr1, curr2);

    return value;
}

int main(int argc, char** argv) 
{
    FILE* fp;
    char** tab;
    int i=0;
    int lines=0;
    int length=10;

    if(argc!=2)
    {
        printf("Incorrent syntax! Use ./name_of_program input_file\n");
        return 1;
    }

    if(!(fp=fopen(argv[1],"r")))
    {
        printf("Could not open the file! Please try again!\n");
        return 2;
    }

    tab = (char**)malloc(length*(sizeof(char*)));

    if(!tab)
    {
        printf("Could not allocate memory! Terminating...\n");
        free(tab);
        return 3;
    }

    while(!feof(fp))
    {
        tab[i]=getNumber(fp);



        if(i>=length) 
            {
                length+=10;

                if((tab=((char**)realloc(tab,sizeof(char*)*length)))==NULL)
                {
                    free(tab);
                    return 5;
                }
            }
        if(tab[i]==NULL)
        {
            printf("Incorrect character in the infile! Terminating\n");
            free(tab);
            return 4;
        }
        if(*tab[i]=='\0')
        {
            free(tab[i]);
            i--;
        }

        i++;
        lines++;
        lines=i;
    }
    printf("\nBEFORE\n");


    for(i=0;i<lines;i++)
    {
        printf("%s\n",tab[i]);
    }

    qsort(tab, lines, sizeof(char*), &compare);

    printf("\nAFTER\n");


    for(i=0;i<lines;i++)
    {
        printf("%s\n",tab[i]);
        free(tab[i]);
    }

    free(tab);
    fclose(fp);
    return 0;
}

助けてくれてありがとう;)

4

5 に答える 5

0

チュクスTHX。あなたは素晴らしいです!プログラミングであなたと同じくらい上手になりたいです。私は(修正された、動作する)ソースコード全体を送信しています:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define NUMBER_CHUNK 13


char* getNumber(FILE* fp) 
{
    int length;
    int current = 0;
    int c;
    char *number, *number2;

    number = (char*)malloc(sizeof(char)*NUMBER_CHUNK);
    if(!number)
    {
        printf("Error while allocating memory!\n");
        return NULL;
    }

    length = NUMBER_CHUNK;

    while(!isspace(c = fgetc(fp)) && !feof(fp))
    {
        if(isdigit(c) || c == '_')
        {
            number[current] = c;
            current++;
            if(current >= length) 
            {

                length+=NUMBER_CHUNK;
                number2 = (char*)realloc(number,length*sizeof(char*));
                if(number2 == NULL)
                {
                    free(number2);
                    return NULL;
                }
                else number2 = number;
            }   
        }
        else
        {
            return NULL;
        }
    }

    number[current] = '\0';
    return number;
}

int compare(const void *str1, const void *str2)
{
    char* curr1;
    char* curr2;

    curr1=*(char**)str1;
    curr2=*(char**)str2;

    while(*curr1=='0' || *curr1=='_') curr1++; 
    while(*curr2=='0' || *curr2=='_') curr2++;

    int value = 0;
    size_t len1 = 0;
    size_t len2 = 0;

    while(*curr1 || *curr2)
    {
        while(*curr1 == '_')
            curr1++;
        while(*curr2 == '_')
            curr2++;

        if(value == 0)
        {
            value = *curr1 - *curr2;
        }
        if(*curr1)
        {
            curr1++;
            len1++;
        }
        if(*curr2)
        {
            curr2++;
            len2++;
        }
    }

    if(len1 != len2)
    {
        return (len1 > len2) ? 1 : -1;
    }

    return value;
}

int main(int argc, char** argv) 
{
    FILE* fp;
    char** tab;
    int i = 0;
    int lines = 0;
    int length = 10;

    if(argc != 2)
    {
        printf("Incorrent syntax! Use ./name_of_program input_file\n");
        return 1;
    }

    if(!(fp = fopen(argv[1],"r")))
    {
        printf("Could not open the file! Please try again!\n");
        return 2;
    }

    tab = (char**)malloc(length*(sizeof(char*)));
    if(!tab)
    {
        printf("Could not allocate memory!\n");
        free(tab);
        return 3;
    }

    while(!feof(fp))
    {
        tab[i] = getNumber(fp);

        if(i >= length) 
            {

                length += 10;
                tab = (char**)realloc(tab,sizeof(char*));
                if(tab == NULL)
                {
                    free(tab);
                    return 5;
                }
            }
        if(tab[i] == NULL)
        {
            printf("Incorrect character in the infile! Terminating\n");
            free(tab);
            return 4;
        }
        if(*tab[i] == '\0')
        {
            free(tab[i]);
            i--;
        }

        i++;
        lines = i;
    }

    printf("\nBEFORE\n");

    for(i = 0 ; i < lines; i++)
    {
        printf("%s\n", tab[i]);
    }

    qsort(tab, lines, sizeof(char*), compare);

    printf("\nAFTER\n");

    for(i = 0; i < lines; i++)
    {
        printf("%s\n",tab[i]);
        free(tab[i]);
    }
    printf("\n");
    free(tab);
    fclose(fp);
    return 0;
}
于 2013-08-26T13:12:22.553 に答える
0

atoi一連の文字列を格納する代わりに、数字以外の文字をすべて取り除き、結果を呼び出して数値を int に変換する方がよいでしょう。これらの数値を配列に直接格納できます。その後、compare関数ははるかに単純になります。

于 2013-08-25T14:22:37.547 に答える
0

「数値」の文字列表現を保持したいが、数値に従って比較したい場合は、compare関数内の文字列として比較しないでください。

内部でcompare各引数 (str1およびstr2) を解析し、先行ゼロとアンダースコアをスキップして数値に変換します。num12 つの数字 ( とと言う) を取得したら、num2だけreturn num1 - num2です。

于 2013-08-25T13:56:15.913 に答える