-3

以前のプログラムを書き直したので、*dirty を **dirty に変更したいと考えています。アドバイスをいただけませんか。これが私のコードです:

void clean(char *dirty)
{
    int i = 0, j = 0;
    char *temp;

    temp = strdup(dirty);

    if(NULL == temp)
    {
        printf("strdup(), failed");
        return;
    }

    while(i < strlen(temp))
    {
        if(isalpha(temp[i]) || isspace(temp[i]) || temp[i] == '?'
            || temp[i] == '.' || temp[i] == '!' || temp[i] == ',')
        {
            dirty[j] = temp[i];
            j++;
        }
        i++;
    }
    dirty[j] = '\0';
    free(temp);
}

変更された main() の一部、私はいくつかの問題を抱えていたので、友人と一緒にこれを作成しました:

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;
        ...
4

2 に答える 2

0

あなたが何をしたいのかに応じて、まず、あなたのメインでこれに注意してください

tab = (char**)realloc(tab, sizeof(char*));

したがって、10 個のポインター配列をサイズ 1 のポインターの配列に再割り当てします。正しくないようです (realloc は、指定されたポインターに割り当てられたメモリを指定されたサイズに変更します。さらに指定すると、length* sizeof のように...すべてのデータを失うだけでなく、配列のサイズを増やします。

「クリーン」関数を文字列の配列 (char *) に適用する場合は、配列の現在の最大サイズを含める必要があります。これをお勧めします。

void clean_All(char ** strings, int size) 
{
     int i;

     if (strings == NULL)
         return;

     for(i = 0; i < size; i++) {
         if (strings[i] == NULL)
             return; 
         clean(strings[i]);
     }

     return;
}
于 2013-09-19T20:34:59.503 に答える