【问题标题】:Unable to convert values from lowercase to uppercase using toupper无法使用 toupper 将值从小写转换为大写
【发布时间】:2017-09-15 07:44:20
【问题描述】:

我正在尝试创建一个程序,要求用户首先输入他们想要从小写转换为大写的值的数量。然后 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;
}

【问题讨论】:

  • Touppertoupper 不是同一个东西,只是说说而已。
  • toupper 不会将某些内容更改为大写;如果可用,它返回一个大写转换。实际的输入参数没有改变。
  • @WhozCraig 以 4 秒的优势击败了你。 :)
  • 你的LowerToUpper函数有什么用?除了提到您使用toupper 的问题之外,它并没有真正做任何有用的事情。为什么不直接拨打toupper
  • 我也不明白你为什么将输入读入array1两次?特别是因为第二次阅读会(在您解决 toupper 问题后)将覆盖您刚刚大写的字符。

标签: c arrays toupper


【解决方案1】:

您没有正确使用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", &amp;amount); 调用是否成功。万一扫描失败,您将得到undefined behavior

最后一个 for 循环中的第二个 scanf() 可能是您不想要的;不想要,充其量是没用的。

【讨论】:

  • 它确实只占了一半!真的很烦人。 '忘记忽略由 RETURN 键输入的换行符'是什么意思?谢谢
【解决方案2】:

改变这个:

toupper(*array);

到这里:

*array = toupper(*array);

自从toupper ref 提到:

返回值

如果存在这样的值,则大写等效于 c(在您的情况下为 *array),否则为 c(未更改)。该值作为 int 值返回 可以隐式转换为 char。


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

【讨论】:

  • 还有一些错误检查?顺便说一句,这里的函数有点矫枉过正,你不觉得吗?
  • Grr @SouravGhosh,你先到了那里......很好的答案,+1。是的,我有,但这可能是基本的教育内容......
  • 感谢您的回复!但这是一个问题,要求我使用一个函数,该函数接受一个 char 指针并且不返回任何内容,同时转换字符串的值。
  • @L.Kay 那么你应该改变你的问题。 :)
  • @L.Kay 太糟糕了,因为将n 字符转换为大写并将它们转储为stdout 的实际任务比他们(无论“他们”是谁)所做的要简单得多它是。 something like this.
猜你喜欢
  • 2011-07-21
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2014-11-07
  • 2020-09-19
  • 2015-11-28
  • 1970-01-01
  • 2018-08-17
相关资源
最近更新 更多