Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C - Program not detecting blank spaces

Tags:

c

I want my program to read a file containing words separated by blank spaces and then prints words one by one. This is what I did:

char *phrase = (char *)malloc(LONGMAX * sizeof(char));
char *mot = (char *)malloc(TAILLE * sizeof(char));
FILE *fp = NULL;
fp = fopen("mots.txt", "r");
if (fp == NULL) {
    printf("err ");
} else {
    fgets(phrase, LONGMAX, fp);
    while (phrase[i] != '\0') {
        if (phrase[i] != " ") {
            mot[m] = phrase[i];
            i++;
            m++;
        } else {
            printf("%s\n", phrase[i]);
            mot = "";
        }
    }
}

but it isn't printing anything! Am I doing something wrong? Thanks!

like image 228
Haha Avatar asked Jul 17 '26 19:07

Haha


1 Answers

The i in the following:

while (phrase[i]!='\0'){  

Should be initialized to 0 before being used, then incremented as you iterate through the string.

You have not shown where/how it is created.

Also in this line,

if(phrase[i]!=" "){

the code is comparing a char: (phrase[i]) with a string: ( " " )

//  char        string
if(phrase[i] !=  " "  ){

change it to:

//  char        char  
if(phrase[i] != ' '){  
//or better yet, include all whitespace:
if(isspace(phrase[i]) {

There is no error checking in the following, but it is basically your code with modifications. Read comments for explanation on edits to fgets() usage, casting return of malloc(), how and when to terminate the output buffer mot, etc.:

This performs the following: read a file containing words separated by blank spaces and then prints words one by one.

int main(void)
{
    int i = 0;
    int m = 0;
    char* phrase=malloc(LONGMAX);//sizeof(char) always == 0
    if(phrase)//test to make sure memory created
    {
        char* mot=malloc(TAILLE);//no need to cast the return of malloc in C
        if(mot)//test to make sure memory created
        {
            FILE* fp=NULL;
            fp=fopen("_in.txt","r");
            if(fp)//test to make sure fopen worked
            {//shortcut of what you had :) (left off the print err)
                i = 0;
                m = 0;
                while (fgets(phrase,LONGMAX,fp))//fgets return NULL when no more to read.
                {
                    while(phrase[i] != NULL)//test for end of last line read
                    {
                       // if(phrase[i] == ' ')//see a space, terminate word and write to stdout
                        if(isspace(phrase[i])//see ANY white space, terminate and write to stdout

                        {

                            mot[m]=0;//null terminate
                            if(strlen(mot) > 0) printf("%s\n",mot);
                            i++;//move to next char in phrase.
                            m=0;//reset to capture next word 
                        }
                        else
                        {

                             mot[m] = phrase[i];//copy next char into mot
                             m++;//increment both buffers
                             i++;//       "           
                        }
                    }

                    mot[m]=0;//null terminate after while loop
                }
                //per comment about last word.  Print it out here.
                mot[m]=0;
                printf("%s\n",mot);
                fclose(fp);
            }
            free(mot);
        }
        free(phrase);
    }
    return 0;
}
like image 71
ryyker Avatar answered Jul 19 '26 09:07

ryyker