2016-12-14 13 views
1

私はいくつかの単語を含む.txtファイルを持っており、小文字にする必要があります。 各単語を小文字にする方法は? strtok()へのtolower()の追加だけでは機能しません。私は何を追加すべきですか?あるいは、最初にファイル全体に対してtolower()を使用する方が簡単でしょうか?しかしどうですか?助けてください!tolower()をchar *と一緒に使用するには?

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

int main(void) 
{ 
    char str[5000]; 
    char *ptr; 
    char *words[5000]; 
    FILE * fp = fopen("hi.txt", "r"); 
    fgets(str, 49, fp);    
    ptr = strtok(str, ",.; ");   
    int i = 0; 
    while(ptr != NULL) 
    { 
     words[i]= ptr; 
     i++; 
     ptr = strtok(NULL, ",.; "); 
    } 
    fclose(fp); 

    for(int j=0;j<i;j++) { 
     printf("%s\n", words[j]); 
     //printf("%s\n", tolower(words[j])); // Doesn't work! 
    } 
    return 0; 
} 

例:

hi.txt

Foo; 
Bar. 
Baz. 

についてtolower、あなたは文字による文字列の文字をループしてみてください可能性が期待される出力

foo 
bar 
baz 
+2

'void main()' - > 'int main(void)'となります。 –

+2

'tolower()'は単語ではなく1文字に適用されます。あなたは 'strlwr()'を試すことができます。 –

答えて

3

tolower機能は、単一の文字を取り、それ下部ケースになり、そうchar*でそれを呼び出すと、本当に意味がありません。 strtokによって返された各部分文字列の最初の文字のみが大文字であることがわかっている場合は、ループ内でその文字にtolowerを呼び出す必要があります。言い換えれば、このような何か:

while(ptr != NULL) 
{ 
    ptr[0] = tolower((unsigned char) ptr[0]); 
    /* 
    Or equivalently ... 
    *ptr = tolower((unsigned char) *ptr) 
    */ 
    words[i]= ptr; 
    i++; 
    ptr = strtok(NULL, ",.; "); 
} 

が大文字可能性があり、文字列でより多くの文字があり、あなたは彼らが下ケースになっていることを確認したい場合は、部分文字列を反復処理し、tolowerを呼び出す必要があります

while(ptr != NULL) 
{ 
    for (char *ch = ptr; *ch; ch++) 
    { 
     *ch = tolower((unsigned char) *ch); 
    } 
    words[i]= ptr; 
    i++; 
    ptr = strtok(NULL, ",.; "); 
} 
+6

'tolower()'は 'unsigned char'または' EOF'の範囲で 'int'をとります。ロバストコードはUBを避けるために '* ch = tolower((unsigned char)* ch);'を使います。 – chux

+1

あなたは正しいです、私はそれについて考えていませんでした。回答が更新されました。 – chad

0

あなたが尋ねたので:

あなたが tolowerを使用しない必要性を行う 場合は10
int i, s = strlen(upperString); 
for (i = 0; i < s; i++) 
    lowerString[i] = tolower(upperString[i]); 

、あなたは小文字に文字列全体を変換するためにstrlwrを使用することができます(それはあなたのシステムに実装されていますならば - strlwrは標準のCではありません)。

+3

IMO、 'for'ループ条件で' i

+0

@JonathanLefflerはい、同意します。私は 'int s = strlen(upperString);'と 'for(i = 0; i

2

tolower()は、1文字のみで動作します。以下の関数を使用して、文字列を小文字に変換できます。

printf("%s\n", cnvtolwr(mystring)); 

この関数の実装は次のとおりです。

char *cnvtolwr(char *str) 
{ 
    unsigned char *mystr = (unsigned char *)str; 

    while (*mystr) { 
     *mystr = tolower(*mystr); 
     mystr++; 
    } 
    return str; 
} 
+2

'strlwr'は標準ではありません。 –

+0

@sameerasyそれはおそらくdownvotedされている可能性があります:a)' strlwr'は標準ではありませんC b)あなたの編集は私の答えと同じコンセプトにしました。悪い質問への良い答えが好きではない。私はdownvoter、btwではない。 –

+2

'strlwr'はユーザー関数の悪い名前です - ' str'で始まり小文字で始まる識別子はStandard Cで予約されています。 –

関連する問題