Заполнение массива строк словами из файла txt - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь заполнить каждую строку массива каждым словом файла.Я не хочу перераспределять память, поэтому я хочу знать, по крайней мере, длину самого длинного слова и количество строк, которое я должен выделить, таким образом, количество слов, записанных в файле.Я не могу понять, где проблема в коде.Я думаю, что это должно быть проблемой с подсчетом самого длинного слова, поскольку, когда я печатаю longest_file_word после присвоения значения, возвращаемого функцией, которую он печатает, -1.

Очевидно, это не работает.

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

int longestWord(char *file, int *nWords);
char ** Create2DStr(ssize_t numStrings, ssize_t maxStrLen);

int main(int argc, char *argv[]){
    int  file_elements_number=0 , i , j , k , z , longest_file_word , count_file_words ;
    char *filename =(char*)malloc((strlen(argv[2]) +1 )*sizeof(filename));
    strcpy( filename , argv[1]);
    for(i  =  0; i < strlen(argv[1])+1 ; i++){
        printf("%c" , filename[i]);
    }
    if(filename = NULL){
        printf("Non c'e' abbastanza memoria");
        return 1;
    }
    if(argc!=2)
    {
        printf("Errore numero parametri passati da linea di comando\n");
        return 1;
    } 
    longest = longestWord( filename , &count);
    printf("ciao %d\n%d\n", count , longest);
    char **file_words = Create2DStr(count, longest);
    FILE *file_ptr;

    const char delim[] = {" \n\t"};
    char line[260];
    char *buf = NULL;

    file_ptr = fopen( filename, "r");
    count=0;
    while(fgets(line, 260, file_ptr))
    {
        buf = strtok(line, delim);
        while(buf)
        {    
            if((strlen(buf) > 0)){
                strcpy(file_words[count], buf);
                count++;
            }
            buf = strtok(NULL, delim);
        }
    }
    for(i = 0 ; i < count ; i++){
         for( j = 0 ; j < longest ; j++){
             printf("%c" , file_words[i][j]);
         }
         printf("\n");
    }


    fclose(file_ptr);    
    free(filename);
    filename = NULL;
    return 0;


}






int longestWord(char *filename, int *nWords)
{
    FILE *file_ptr=0;
    int cnt=0, longest=0, numWords=0;
    char c;
    file_ptr = fopen(filename, "r");
    if(file_ptr){
        while ( (c = fgetc(file_ptr) ) != EOF )
        {
            if ( isalnum (c) ) {
                cnt++;  
            }
            else if ( ( ispunct (c) ) || ( isspace(c) ) || (c == '\0' ) || (c== '\n'))
            {
                (cnt > longest) ? (longest = cnt, cnt=0) : (cnt=0);
                numWords++;
            }
        }
        *nWords = numWords;
        fclose(file_ptr);
    }
    else {
        return -1;
    }

    return longest;
}

char ** Create2DStr(ssize_t numStrings, ssize_t maxStrLen){
    int i;
    char **a = {0};
    a =(char**) calloc(numStrings, sizeof(a));
    for(i=0;i<numStrings; i++)
    {
        a[i] = (char*)calloc(maxStrLen + 1, 1);
    }
    return a;
}

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Результат -1 означает, что функция longestWord не может открыть указанное имя файла, которое может быть результатом if(filename = NULL)

. Помимо этого, трудно понять, что вы делаете с argv[1] и argv[2] для приготовления filename.Вы выделяете память, основываясь на длине строки argv[2], затем копируете строку из argv[1], что может быть длиннее.

Вы должны выполнить проверки argc и filename, прежде чем получить доступ к argv или filename.

0 голосов
/ 07 декабря 2018

Вы делаете,

if(filename = NULL)

вместо

if(filename == NULL)

после прочтения вашего имени файла.

Вы должны компилировать с включенными предупреждениями, -Wall на gcc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...