创建新的转换字符串从“toupper()”在c

isr3a4wc  于 2022-12-17  发布在  其他
关注(0)|答案(4)|浏览(129)

尝试获取小写字符串,并在将字符变为大写后创建新字符串

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

int main (void)
{
    string word = "science";
    char new_word[] = {};

    for (int i = 0, len = strlen(word); i < len; i++)
    {
        if (islower(word[i]))
        {
            new_word = new_word + toupper(word[i]);
        }
    }
}

我收到“错误:数组类型“char[0]"不可赋值”。
这还不是全部,我相信我的完整程序可能有一个更简单的方法,但是我构建了其他所有的东西,我唯一挣扎的一点是循环通过我的字符串,以获得一个大写的新词。
任何帮助将不胜感激!

wz1wpwve

wz1wpwve1#

char new_word[] = {};

新的char数组的长度为0,当您在其边界之外访问它时,任何访问都会调用未定义行为(UB)。
如果编译器支持VLA:

string word = "science";
    char new_word[strlen(word) + 1] = {0,};

如果没有:

string word = "science";
    char *new_word = calloc(1, strlen(word) + 1);

以及

new_word[i] = toupper((unsigned char)word[i]);

如果使用calloc,请不要忘记free分配的内存

vc6uscn9

vc6uscn92#

未定义的行为word[i] < 0

通过以unsigned char的形式访问字符串来避免这种情况
根据C参考关于toupper()
中间顶部(中间通道);
ch -要转换的字符。如果ch的值不能表示为〉unsigned char且不等于EOF,则行为未定义。
这是不正确的,编译器给出错误,“错误:为数组类型为”“的表达式赋值

new_word = new_word + toupper(word[i]);

数组类型为赋值的LHS时不允许这样做。已更改为new_word[i] = toupper((unsigned char)word[i]);

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

int main (void)
{
    char word[] = "science";
    char new_word[sizeof word] = ""; 
    int i;

    for (i = 0; i < sizeof(word); i++)
    {
        if (islower(word[i]))
        {
            new_word[i] = toupper(word[i]);
        }
        else    /* for Upper case latter, simply fill the array */
        {
            new_word[i] = word[i];
        }
    }
    new_word[i] = '\0';
    printf("%s", new_word);
}

产出:科学

**编辑:**仅回应M.M给出的解决方案的注解和大卫C.兰金铸造的注解。阅读M.M和David C. Rankin的以下注解从islower()toupper()中删除unsigned char

f1tvaqid

f1tvaqid3#

This is but one way of accomplishing the task. Make sure to come up with your way of doing.

    #include <stdio.h>
    #include <string.h>
    #define MAX_BUFF 128   
    
    char *upperCase(char *c) {
        //printf("%s, %d", c, strlen(c));
        for(int i=0; i<strlen(c) && i<MAX_BUFF; i++) {
           c[i] = c[i] - ' ';  // convert char to uppercase
           //printf(">> %c", c[i]);
        }
        return c;
     }  
    int main (void)
    {
        char word[MAX_BUFF] = "science";
        char new_word[MAX_BUFF];
        
         printf("in>> %s \n", word);
         strcpy(new_word, upperCase(&word[0]));
         printf("out>> %s\n", new_word);
    }

Output:
in>> science 
out>> SCIENCE
ni65a41a

ni65a41a4#

命名数组不能在C中调整大小,你必须正确地设置大小:

size_t len = strlen(word);
char new_word[len + 1];   // leaving room for null-terminator

注意,当new_word的大小由函数调用决定时,没有初始化器可以用于new_word(一个蹩脚的规则,但它就是这样);并且可以去掉len循环变量,因为它已经在前面定义过了。
然后将每个字符设置到位:

new_word[i] = toupper(word[i]);

但是要小心周围的if语句:如果该值为false,则需要设置new_word[i] = word[i]
(Pro提示,您可以完全删除if,因为toupper被定义为如果字符不是小写则无效)。
最后,结尾处应该有一个空终止符:

new_word[len] = 0;

注意:从技术上讲,对toupper的调用应该是:toupper((unsigned char)word[i])--查看toupper的文档以了解更多信息。

相关问题