2011-12-30 15 views
0

私が書いようとしているコードは、txtファイルからテキストを読み込んで文字列に分割することになっています。私は、次のコードになってきた。問題は、私が手出力は(今の別個の文字列など)のテキストだけでなく、(キャリッジリターンです)\ rとされている一部の文字だけではないということですStrtokの問題C(EOF文字?)

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int main(){ 
    FILE *fp; 
    int i=0; 
    char *words=NULL,*word=NULL,c; 
    if ((fp=fopen("monologue.txt","r"))==NULL){ /*Where monologue txt is a normal file with plain text*/ 
     printf("Error Opening File\n"); 
     exit(1);} 
    while ((c = fgetc(fp))!= EOF){ 
     if (c=='\n'){ c = ' '; } 
     words = (char *)realloc(words, ++i*sizeof(char)); 
     words[i-1]=c;} 
    word=strtok(words," "); 
    while(word!= NULL){ 
     printf("%s\n",word); 
     word = strtok(NULL," ");} 
    exit(0); 
} 

が、 \ 241 \ r \ 002私は彼らが何かを見つけることができません?あなたは私を助けることができます?

+0

がUnicodeとして保存されたファイルのですか? – Ulterior

+0

各入力文字に対して 'realloc()'を呼び、バッファのサイズを1バイトだけ増やします。それは非常に非効率的である可能性が高いです。必要に応じてバッファサイズを2倍にする方が高速になります。 'realloc()'が成功したか失敗したかをチェックする必要があります。 –

答えて

2

主な問題は、ビルドした文字列の最後にヌルターミネータを置かないことです。

変更を行います。

while ((c = fgetc(fp))!= EOF){ 
     if (c=='\n'){ c = ' '; } 
     words = (char *)realloc(words, ++i*sizeof(char)); 
     words[i-1]=c;} 
    word=strtok(words," "); 

while ((c = fgetc(fp))!= EOF){ 
     if (c=='\n'){ c = ' '; } 
     ++i; 
     words = (char *)realloc(words, i + 1); 
     words[i-1]=c;} 
    words[i] = '\0'; 
    word=strtok(words," "); 
+0

どうすれば避けることができますか? – Melkon

+0

それは今では完璧に動作しますが、なぜ私のコードで理解できないのですか? word = strtok(NULL、 "");正しく印刷するためには が必要です。さらに、1つだけ使用したい場合は、どのように単語ポインタの各単語にアクセスできますか? – Melkon

+1

@ Constantinos:次のトークンを取得するには 'strtok(NULL、" ")'が必要です。これは 'strtok()'が動作するように設計されています。あなたのコメントの第二の質問が何を意味するのか分かりません。 –