#include <stdio.h>
int main() {
int i;
char arr[100];
for (i = 0; i < 100; i++)
scanf("%c", &arr[i]);
for (i = 0; i < 100; i++) {
if ('a' <= arr[i] && arr[i] <= 'z')
arr[i] =-32;
else
if ('A' <= arr[i] && arr[i] <= 'Z')
arr[i] =+32;
}
printf("%s", arr);
return 0;
}
出现了一个问题:
您已经获得了一个由大写和小写英文字母组成的字符串。您需要更改此字符串中每个字母的大小写。也就是说,所有大写字母都应转换为小写字母,所有小写字母都应转换为大写字母。然后,您需要打印生成的字符串以进行输出。
上面的代码有什么问题?它编译成功,但有一个运行时错误。
6条答案
按热度按时间4jb9z9bj1#
您的代码中存在多个问题:
arr[i] =-32;
不会将arr[i]
递减32
,而是将32
存储到arr[i]
中。组合赋值运算符拼写为-=
。在另一种情况下,+=
也会出现同样的问题。32
将小写转换为大写适用于ASCII,但不能移植到其他字符集。同样,比较'a'
和'z'
适用于ASCII,但不适用于EBCDIC。应使用<ctype.h>
中的函数。scanf("%c"...)
读取了100个字符,但是你没有检查返回值,也没有空终止数组。此外,你应该读取最多比数组大小小一的值,以便为'\0'
字节留出空间。正如代码所示,你的程序在printf("%s", arr);
调用了未定义的行为,因为arr
不是空终止的。以下是更正后的版本:
ubof19bj2#
最明显的问题是字符串没有以null结尾,因此当调用
printf("%s", arr)
时,行为将不可预测。xj3cbfub3#
你的代码的问题是它从来不终止字符串,如果你读了100个字符,然后你想用
%s
在printf
中打印它们,你必须在末尾添加一个null终止符,如下所示:注意,库函数
islower
/isupper
提供了一种可移植的、可读性更强的方法来测试字符类型。类似地,tolower
/toupper
向代码读者提供了更多关于您的意图的信息,而不是简单地加减32。此外,使用这些标准函数的C代码将在使用非ASCII字符编码的系统上工作。wi3ka0sx4#
为了执行
printf("%s", arr)
,需要使用空字符终止arr
。一种方法是:
char arr[101]
arr[100] = 0
8fq7wneg5#
您的代码存在以下问题:非空终止的输入字符串、不正确的小写/大写转换以及与=- / -=和=+ / +=运算符混淆。
下一个代码基于您的代码:
作为获取以空值结尾的字符串的替代方法,它使用fgets()代替scanf(),这只是示例。
还使用C库函数来避免不同字符集的问题,简化条件并用于大写/小写操作。
测试它here。
rkue9o1l6#