无法使用toupper将值从小写转换为大写

时间:2017-09-15 07:44:20

标签: c arrays toupper

我尝试创建一个程序,要求用户首先输入他们想要从小写转换为大写的值。然后for循环将每个值分配给一个数组。然后,数组经过另一个for循环,使用LowerToUpper函数将值转换为大写。

当我去运行程序时,它会接收值,然后在命令窗口开始加倍,并在完成输入值时停止,而不是printf结果。你能解释一下原因吗?提前谢谢

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

void LowerToUpper(char* array)
{

        toupper(*array);
}

int main(void)
{
        int i, amount;
        printf("How many values?\n");
        scanf("%d", &amount);
        char *d;
        char array1 [amount];

        printf("Please enter the values\n");

        for(i=0; i<amount; i++)
        {
                scanf("%c", &array1[i]);
        }


        for(i=0; i<amount; i++)
        {
                d=&array1[i];
                LowerToUpper(d);
                scanf("%c", &array1[i]);
                printf("%c", array1[i]);
        }

        return 0;
}

2 个答案:

答案 0 :(得分:2)

您没有正确使用toupper()。如果成功,函数将返回转换后的值。您需要使用返回的值。提供的参数不会更改。

也就是说,程序结构不必要地复杂化。你可以像

一样简化它
    for(i=0; i<amount; i++)
    {
            int result = toupper (array1[i]);
            if (result != array1[i]) printf("%c", result); //just checkin', if converted
    }

那就是说,你现在还有很多其他问题,比如

    scanf("%c", &array1[i]);

令您惊讶的是,这只会询问您输入数量的一半。为什么?您忘记忽略 RETURN 键输入的换行符。

然后,您没有检查scanf("%d", &amount);电话是否成功。如果扫描失败,您最终会得到undefined behavior

最后一个scanf()循环中的第二个for可能是你不想要的东西,它充其量是无用的。

答案 1 :(得分:1)

改变这个:

toupper(*array);

到此:

*array = toupper(*array);

toupper参考文献提及:

  

返回值

     

大写等于c(在您的情况下为*array),如果存在此值,或者c(否则为)。该值作为int值返回   可以隐式地转换为char。

PS:为此操作定义一个函数LowerToUpper()(一行代码)是一种矫枉过正,你可以在main()内调用那一行代码(我的意思是函数的主体)被移入main())。