2

いくつかの単語を含む .txt ファイルがあり、それらを小文字にする必要があります。各単語を小文字にする方法は? tolower() を strtok() に追加するだけでは機能しません。何を追加すればよいですか?または、最初にファイル全体で tolower() を使用する方が簡単でしょうか? しかし、どのように?助けてください!

#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.

期待される出力

foo
bar
baz
4

3 に答える 3

4

tolower()単一の文字に対してのみ機能します。以下の関数を使用して、文字列を小文字に変換できます。

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

関数の実装は以下の通りです。

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

    while (*mystr) {
        *mystr = tolower(*mystr);
        mystr++;
    }
    return str;
}
于 2016-12-14T17:59:33.300 に答える
4

このtolower関数は 1 文字を受け取り、それを小文字にするため、 a で呼び出すの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, ",.; "); 
}
于 2016-12-14T18:04:28.180 に答える
0

について尋ねたのでtolower、文字列を文字ごとにループしてみることができます。

int i, s = strlen(upperString);
for (i = 0; i < s; i++)
    lowerString[i] = tolower(upperString[i]);

を使用する必要がない場合は、 を使用して文字列全体を小文字に変換tolowerできます(システムに実装されている場合 -標準 C ではありません)。strlwrstrlwr

于 2016-12-14T17:55:59.680 に答える