#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;
}
出现了问题:
您已获得一个由大写和小写英文字母组成的字符串。您需要更改此String中每个字母的大小写。也就是说,所有大写字母都应该转换为小写,所有小写字母都应该转换为大写。然后,您需要将结果String打印到输出。
上述代码有什么问题?它正在成功编译,但存在运行时错误。
答案 0 :(得分:4)
您的代码中存在多个问题:
主要问题是您调整案例:arr[i] =-32;
不会arr[i]
递减32
,而是将32
存储到arr[i]
。组合赋值运算符拼写为-=
。在另一种情况下,+=
存在同样的问题。
通过减去32
为ASCII工作,将小写转换为大写,但不能移植到其他字符集。同样,与'a'
和'z'
相比,适用于ASCII,但不适用于EBCDIC。您应该使用<ctype.h>
。
您使用scanf("%c"...)
读取了100个字符,但是您没有检查返回值,也没有null终止数组。此外,您应该读取最多小于数组大小的一个,以便为'\0'
字节留出空间。编码后,您的程序会在printf("%s", arr);
调用未定义的行为,因为arr
未终止。
以下是更正后的版本:
#include <ctype.h>
#include <stdio.h>
int main(void) {
int c;
while ((c = getchar()) != EOF) {
if (isupper(c))
c = tolower(c);
else
if (islower(c))
c = toupper(c);
putchar(c);
}
return 0;
}
答案 1 :(得分:2)
最明显的问题是你没有空字符串终止字符串,所以当你调用printf("%s", arr)
时,行为将是不可预测的。
答案 2 :(得分:2)
您的代码的问题在于它永远不会终止字符串。如果您读取100个字符,然后想要在%s
中使用printf
打印它们,则必须在末尾添加空终结符,如下所示:
char arr[100+1]; // See +1
... // Reading code
arr[100] = '\0';
请注意,库函数islower
/ isupper
提供了一种可移植且更易读的方法来测试字符类型。同样,tolower
/ toupper
向代码阅读器提供有关您的意图的更多信息,而不仅仅是添加和减去32。此外,使用这些标准函数的C代码将适用于具有非ASCII字符的系统编码
答案 3 :(得分:1)
为了printf("%s", arr)
,您需要使用空字符终止arr
。
一种方法是:
char arr[101]
arr[100] = 0
答案 4 :(得分:0)
你的代码有几个问题:not-null-terminated输入字符串,unperper lower / uppercase转换和与= - / - =和= + / + =运算符的混淆。
下一个代码基于您的代码:
作为获取以null结尾的字符串的替代方法,它使用fgets()而不是scanf(),仅用于示例。
还使用C库函数来避免不同字符集的问题,简化条件以及大写/小写操作。
编辑以提高代码质量,正如@chqrlie在评论中所建议的那样。
#include <stdio.h>
#include <ctype.h>
int main()
{
int i;
char arr[101];
printf("Enter string: ");
fgets(arr, sizeof(arr), stdin);;
for(i=0;i<strlen(arr); i++)
{
int value = (unsigned char) arr[i]; // to properly use int parameters, as expected by ctype.h next functions
if (isupper(value))
{
arr[i]=tolower(value);
}
else {
if (islower(value))
{
arr[i]=toupper(value);
}
}
}
printf("%s", arr);
return 0;
}
测试here。