如何在C中将一个字组成一个单词

时间:2015-02-18 20:54:29

标签: c arrays char

我目前正从文件中收集输入,但我的程序将每个字母分成char数组而不是每个单词。如何更改我的代码以获取每个单词?

char c, fileName[20];
FILE *f;

void getFile() {    
    f = fopen(fileName, "r");

    while((c = fgetc(f)) != EOF) {
        printf("%c",c);
    }
    fclose(f);
}

4 个答案:

答案 0 :(得分:1)

您可以使用char * fgets ( char * str, int num, FILE * stream ); 然后使用char *strtok(char *str, const char *delim) 例如

#include <stdio.h>

 int main()
{
 FILE * pFile;
 char mystring [100];
 const char delimters[2] = " ,:";
 char *token;

 pFile = fopen ("myfile.txt" , "r");
 if (pFile == NULL) perror ("Error opening file");
 else {
   if ( fgets (mystring , 100 , pFile) != NULL )

    /* get the first token */
     token = strtok(mystring, delimiters);

  /* walk through other tokens */
  while( token != NULL ) 
 {
    printf( " %s\n", token );

  token = strtok(NULL, delimiters);
 }

   fclose (pFile);
  }
 return 0;
}

答案 1 :(得分:1)

您可以将扫描集与fscanf或sscanf配合使用。此扫描集%29[a-zA-Z]读取小写和大写英文字符,并在遇到不在集合中的字符时停止。 29限制了要读取的最大字符数,以便不覆盖缓冲区word[30]。当fscanf失败时,else会从文件中读取一个字符,然后再次尝试fscanf读取另一个字。
这也使用命令行传入文件以读取为argv [1]。

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

int main( int argc, char *argv[])
{
    char word[30] = {'\0'};
    int ch = 0;
    FILE *pf = NULL;

    if ( argc != 2) {//command requires program name and a file name
        printf ( "useage: program filename\n");
        return 1;
    }

    if ( ( pf = fopen ( argv[1], "r")) == NULL) {
        perror ( "could not open file");
        return 1;
    }

    while ( 1) {
        if ( ( fscanf ( pf, "%29[a-zA-Z]", word)) == 1) {
            printf ( "%s\n", word);
        }
        else {
            if ( ( ch = fgetc ( pf)) == EOF) {//read one character and check for end of file
                break;
            }
            //could do something here with the value of ch if needed
        }
    }
    printf ( "--DONE--\n");

    return 0;
}

这将为每个单词分配一个数组。在添加单词时,使用realloc扩展数组。

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

int main( int argc, char *argv[])
{
    char **words = NULL;//pointer for words
    char **temp = NULL;
    char word[30] = {'\0'};
    int ch = 0;
    int each = 0;
    int found = 0;
    int count = 0;
    int wordsize = 0;
    FILE *pf = NULL;

    if ( argc != 2) {//command requires program name and a file name
        printf ( "useage: program filename\n");
        return 1;
    }

    if ( ( pf = fopen ( argv[1], "r")) == NULL) {
        perror ( "could not open file");
        return 1;
    }

    while ( 1) {
        if ( ( fscanf ( pf, "%29[a-zA-Z]", word)) == 1) {
            found = 0;
            for ( each = 0; each < wordsize; each++) {
                if ( strcmp ( words[each], word) == 0) {
                    found = 1;
                    break;
                }
            }
            if ( found == 0) {
                wordsize += 1;// increment number of words
                temp = realloc ( words, wordsize * sizeof ( char *));//reallocate for another word
                if ( temp != NULL) {
                    words = temp;
                    words[wordsize - 1] = malloc ( strlen ( word) + 1);//malloc for the word itself
                    if ( words[wordsize - 1] != NULL) {
                        strcpy ( words[wordsize - 1], word);
                    }
                    else {
                        printf ( "malloc failed\n");
                        wordsize -= 1;
                        break;
                    }
                }
                else {
                    printf ( "realloc failed\n");
                    wordsize -= 1;
                    break;
                }
            }
            printf ( "%s\n", word);
        }
        else {
            if ( ( ch = fgetc ( pf)) == EOF) {//read one character and check for end of file
                break;
            }
            //something could be done with ch if needed
        }
    }
    printf ( "--DONE Reading file--\n");
    for ( each = 0; each < wordsize; each++) {// print each word
        printf ( "%s\n", words[each]);
    }
    count = 0;
    printf ( "Enter a word to search for\n");
    if ( ( scanf ( "%29[a-zA-Z]", word)) == 1) {
        for ( each = 0; each < wordsize; each++) {
            if ( strcmp ( words[each], word) == 0) {
                printf ( "Found %s at index %d\n" word, each);
                count++;
            }
        }
        printf ( "Found %s %d times\n" word, count);
    }
    for ( each = 0; each < wordsize; each++) {//release memory
        free ( words[each]);
    }
    free ( words);


    return 0;
}

答案 2 :(得分:0)

使用fscanf(3)代替

char word[256], *p;
while(fscanf(f, "%s", &word) != EOF) {
     printf("%s\n", word);
     /* break down word into individual chars */
     for(p=word; *p; p++) {
         printf("%c ", *p);
         }
     printf("\n");
     }

答案 3 :(得分:0)

  1. 第一个问题fgetc()会返回int您无法将EOF存储在char变量中。
  2. 您应该检查fopen()是否没有返回NULL
  3. 您可以使用此技术阅读此类文字

    #include <stdlib.h>
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    #define MAX_BUFFER_SIZE 256
    
    char **load_words_from_file(const char *filename)
    {
        size_t wordcount;
        size_t charcount;
        char   buffer[MAX_BUFFER_SIZE];
        int    chr;
        FILE  *file;
        char **words;
        void  *pointer;
    
        file = fopen(filename, "r");
        if (file == NULL)
            return NULL;
        wordcount = 0;
        charcount = 0;
        words     = NULL;
        while ((chr = fgetc(file)) != EOF)
        {
            /* it's a white space or it exceeded buffer size, it's a word delimiter */
            if ((isspace(chr) != 0) || (charcount >= sizeof(buffer) - 1))
            {
                /* 'nul' terminate 'buffer' for strcpy() and strlen() */
                buffer[charcount] = '\0';
                pointer           = realloc(words, (1 + wordcount) * sizeof(char *));
                if (pointer == NULL) /* failure, free allocated memory and return NULL */
                    goto failure;
                words            = pointer;
                words[wordcount] = malloc(1 + charcount);
                charcount        = 0; /* reset character count */
                if (words[wordcount] == NULL)
                    goto failure;
                strcpy(words[wordcount], buffer);
    
                wordcount += 1;
            }
            else
            {
                /* store the character and count it */
                buffer[charcount] = (char)chr;
                charcount        += 1;
            }
        }
        pointer = realloc(words, (1 + wordcount) * sizeof(char *));
        if (pointer == NULL)
            goto failure;
        words            = pointer;
        words[wordcount] = NULL; /* this will let you know when to stop fetching words */
    
        fclose(file);
        return words;
    failure:
        for (size_t i = 0 ; i < wordcount ; ++i)
            free(words[i]);
        free(words);
        return NULL;
    }
    
    int
    main()
    {
        const char *filename = "your-file-name-here";
        char      **words    = load_words_from_file(filename);
        size_t      counter  = 0;
    
        if (words == NULL)
        {
            printf("no words found in the file\n");
            return -1;
        }
        while (words[counter] != NULL)
        {
            printf("%zuth word: %s\n", 1 + counter, words[counter]);
            free(words[counter]); /* this program will not use it again */
            counter += 1;
        }
        free(words);
        return 0;
    }
    

    strtok()方法也可行,但更难理解。

    请注意goto的使用,这是一种良性用法,虽然有些人认为goto总是有害的,但事实并非如此,使用它就像这样做了坚持DRY原则。