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