如何使用char *(?

时间:2016-12-14 17:48:57

标签: c char tolower

我有一个带有一些单词的.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

3 个答案:

答案 0 :(得分:3)

tolower()仅适用于单个字符。您可以使用以下函数将字符串转换为小写:

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

该功能的实现如下。

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

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

答案 1 :(得分: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, ",.; "); 
}

答案 2 :(得分:0)

由于您询问了tolower,您可以尝试按字符循环字符串:

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

如果需要使用tolower,您可以使用strlwr将整个字符串转换为小写(如果它已在您的系统 - strlwr不是标准C)。