0

テキストファイルを解析しています:

Hello, this is a text file.

ファイルをchar []に変換して作成します。次に、配列を取得して反復処理し、ファイルを単語に分割する配列の配列を作成します。

 string[0] = Hello
 string[1] = this
 string[2] = is

これは私のコードです:

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

void printWord(char *string) {
int i;
for (i = 0; i < strlen(string); i ++)
    printf("%c", string[i]);
printf("\n");
}

void getWord(char *string) {
char sentences[5][4];
int i;
int letter_counter = 0;
int word_counter = 0;

    for (i = 0; i < strlen(string); i ++) {
            // Checks if the character is a letter
    if (isalpha(string[i])) {
        sentences[word_counter][letter_counter] = string[i];
        letter_counter++;
    } else {
        sentences[word_counter][letter_counter + 1] = '\0';
        word_counter++;
        letter_counter = 0;
    }
}

// This is the code to see what it returns:
i = 0;
for (i; i < 5; i ++) {
    int a = 0;
    for (a; a < 4; a++) {
        printf("%c", sentences[i][a]);
    }
    printf("\n");
}
}

int main() {
    // This just returns the character array. No errors or problems here.
char *string = readFile("test.txt");

getWord(string);

return 0;
}

これはそれが返すものです:

Hell
o
this
is
a) w

これはポインターなどと関係があると思います。私は Java のバックグラウンドが強いので、まだ C に慣れています。

4

2 に答える 2

3

の数を 5 に制限し、各単語の長さを 4sentences[5][4]に制限していsentencesます。より多くの長い単語を処理するには、単語を大きくする必要があります。試してみてくださいsentences[10][10]。また、入力単語が処理できる長さよりも長くないかどうかもチェックしていませんsentences。より大きな入力では、これはヒープオーバーフローとアクセス違反につながる可能性があります。C はポインターをチェックしないことに注意してください!

もちろん、この方法を大きな単語を含む大きなファイルに使用する場合は、ファイルを大きくするか、動的に割り当てる必要があります。

于 2013-04-15T23:43:38.987 に答える
0

strtok を使用しないサンプル:

void getWord(char *string){
    char buff[32];
    int letter_counter = 0;
    int word_counter = 0;
    int i=0;
    char ch;

    while(!isalpha(string[i]))++i;//skip
    while(ch=string[i]){
        if(isalpha(ch)){
            buff[letter_counter++] = ch;
            ++i;
        } else {
            buff[letter_counter] = '\0';
            printf("string[%d] = %s\n", word_counter++, buff);//copy to dynamic allocate array
            letter_counter = 0;
            while(string[++i] && !isalpha(string[i]));//skip
        }
    }
}

strtok バージョンを使用します。

void getWord(const char *string){
    char buff[1024];//Unnecessary if possible change
    char *p;
    int word_counter = 0;

    strcpy(buff, string);
    for(p=buff;NULL!=(p=strtok(p, " ,."));p=NULL){//delimiter != (not isaplha(ch))
        printf("string[%d] = %s\n", word_counter++, p);//copy to dynamic allocate array
    }
}
于 2013-04-16T09:28:29.880 に答える