【问题标题】:Converting array of char pointers to lowercase C [closed]将char指针数组转换为小写C [关闭]
【发布时间】:2016-02-18 19:21:30
【问题描述】:

我有以下 char 指针数组:

 char* wordArray[ARRAY_MAX];

现在我想把所有的字符都变成小写。我试图通过循环遍历数组然后使用指针将每个字符转换为小写,使用以下代码来做到这一点:

 for (i = 0; i < 2000; i++) { 
     lineoftext2[i] = lineOfText[i]; //lineoftext is just an array of chars
 }

words = strtok(lineoftext2, "\n ,-.)");
Word wordPlaceArr[ARRAY_MAX];
int wordNumArr[ARRAY_MAX];

while (words != NULL)
{
    wordArray[count] = words;
    count++;
    words = strtok(NULL, "\n ,-.)"); //Remove punctuation an put into an array of char pointers
}

 char* wordpointer;  //HERE is where I want to convert all the letters to lowercase 

for (i = 0; i < count-1; i++) {
    for(wordpointer = wordArray[i]; wordpointer != '\0'; wordpointer+= sizeof(char)) {
         *wordpointer = tolower(*wordpointer); //results in seg-fault
    }
}

当我尝试将 wordArray 中的所有字符串设为小写时,上面的代码会导致段错误。如何解决此问题以成功将所有字符串转换为小写

【问题讨论】:

  • 几个小时前你已经问过同样的问题了!请勿转发问题!

标签: c arrays string pointers char


【解决方案1】:
wordpointer != '\0';

这永远不会是真的,所以循环永远不会停止。除非它环绕,否则指针永远不会等于零,并且您会在此发生之前很久就崩溃。你的意思是*wordpointer != '\0';

【讨论】:

  • 这仍然会导致段错误...没关系!谢谢!
【解决方案2】:

您要执行的操作要求您检查wordArray isupper 指向的每个字符串中的每个字符是否然后转换字符tolower。你离得不远了。以下示例为您的方法提供了一个补全:

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

enum { WORD_MAX = 64, ARRAY_MAX = 256 };

int main (void) {

    char *wordArray[ARRAY_MAX] = {NULL};
    char line[WORD_MAX] = "";
    char *p, *delims = " \t\n;,.";
    size_t i, idx = 0;

    while (fgets (line, WORD_MAX, stdin)) { /* read line/tokenize */
        for (p = strtok (line, delims); p; p = strtok (NULL, delims))
            wordArray[idx++] = p;

        if (idx == ARRAY_MAX)   /* check against max */
            break;
    }

    for (i = 0; i < idx; i++) { /* convert to lower and output */
        printf (" wordArray[%2zu] : %-8s => ", i, wordArray[i]);
        p = wordArray[i];
        while (*p) {
            if (isupper (*p))
                *p = tolower (*p);
            p++;
        }
        printf ("%s\n", wordArray[i]);
    }

    return 0;
}

使用/输出

$ echo "Joe tOM FRANK haRRY" | ./bin/fgets_ptrarray_tolower
 wordArray[ 0] : Joe      => joe
 wordArray[ 1] : tOM      => tom
 wordArray[ 2] : FRANK    => frank
 wordArray[ 3] : haRRY    => harry

如果您有任何问题,请告诉我。

【讨论】:

    【解决方案3】:

    下面的代码可以满足你的需求......

    它利用了 C 中的 char 实际上是整数,而在 ASCII 表中每个小写字符都可以表示为 UPPER_CASE_LETTER+32 的事实

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char *foo(char *word){
        char *tmp = word; /* For the new string */
        char *ptr = word; /* To save the poiner */
    
        for(; *ptr; ++ptr, ++tmp) {
            if (*ptr >= 'a' && *ptr <= 'z')
            /* char is lower case */
                *tmp = (*ptr) - 32;
            else if (*ptr >= 'A' && *ptr <= 'Z')
            /* char is upper case */
                *tmp = (*ptr) + 32;
            else
                *tmp = *ptr;
        }
        return word;
    }
    
    int main(int argc, char **argv)
    {
        char line[]="This is a test LiNe FOR You";
        char *buf;
    
        printf("%s\n",foo(strtok(line," ")));
    
        while(buf=strtok(NULL," "))
            printf("%s\n",foo(buf));
    
        return 0;
    }
    

    代码可以在几个方面进行改进,例如添加一些边界检查代码,或者在调用strtok()之前进行额外检查

    代码的输出是

    $ ./lower_upper.exe
    tHIS
    IS
    A
    TEST
    lInE
    for
    yOU
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      相关资源
      最近更新 更多