Haha
Haha

Reputation: 1019

C - Program not detecting blank spaces

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!

Upvotes: 2

Views: 1366

Answers (3)

ryyker
ryyker

Reputation: 23236

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;
}

Upvotes: 4

chqrlie
chqrlie

Reputation: 145287

Your program has multiple problems:

  • the test for end of file is incorrect: you should just compare the return value of fgets() with NULL.
  • the test for spaces is incorrect: phrase[i] != " " is a type mismatch as you are comparing a character with a pointer. You should use isspace() from <ctype.h>

Here is a much simpler alternative that reads one byte at a time, without a line buffer nor a word buffer:

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

int main() {
    int inword = 0;
    int c;

    while ((c = getchar()) != EOF) {
        if (isspace(c)) {
            if (inword) {
                putchar('\n');
                inword = 0;
            }
        } else {
            putchar(c);
            inword = 1;
        }
    }
    if (inword) {
        putchar('\n');
    }
    return 0;
}

Upvotes: 2

Hitokiri
Hitokiri

Reputation: 3699

phrase[i]!=" "

You compare character (phrase[i]) and string (" "). If you want to compare phrase[i] with space character, use ' ' instead.

If you want to compare string, use strcmp.

printf("%s\n",phrase[i]);

Here, you use %s for printing the string, but phrase[i] is a character.

Do not use mot=""; to copy string in c. You should use strcpy:

strcpy(mot, " ");

If you want to print word by word from one line of string. You can use strtok to split string by space character.

fgets(phrase,LONGMAX,fp);
char * token = strtok(phrase, " ");
while(token != NULL) {
   printf("%s \n", token);
   token = strtok(NULL, " ");
}

OT, your program will get only one line in the file because you call only one time fgets. If your file content of many line, you should use a loop for fgets function.

while(fgets(phrase,LONGMAX,fp)) {
   // do something with pharse string. 
   // strtok for example.
   char * token = strtok(phrase, " ");
   while(token != NULL) {
      printf("%s \n", token);
      token = strtok(NULL, " ");
   }
}

Upvotes: 3

Related Questions