#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;
}有一个问题:
你得到了一个由大写字母和小写字母组成的字符串。您需要更改此字符串中每个字母表的大小写。也就是说,所有大写字母应转换为小写字母,所有小写字母应转换为大写字母。然后,需要打印出要输出的结果字符串。
上面的代码有什么问题?它正在成功编译,但存在一个运行时错误。
发布于 2017-01-27 13:55:35
代码中存在多个问题:
arr[i] =-32;不通过32减少arr[i],而是将32存储到arr[i]中。组合赋值运算符拼写为-=。在另一种情况下,+=也有同样的问题。32将小写转换为大写,适用于ASCII,但不能移植到其他字符集。类似地,与'a'和'z'相比,ASCII适用于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;
}发布于 2017-01-27 13:40:46
最明显的问题是,您不是空终止字符串,所以当您调用printf("%s", arr)时,行为将是不可预测的。
发布于 2017-01-27 13:41:45
代码的问题是它永远不会终止字符串。如果读取100个字符,然后要用%s在printf中打印这些字符,则必须在末尾添加一个空终止符,如下所示:
char arr[100+1]; // See +1
... // Reading code
arr[100] = '\0';注意,库函数islower/isupper提供了一种可移植的、更易读的测试字符类型的方法。类似地,tolower/toupper向您的代码读者提供了更多关于您的意图的信息,而不是简单地添加和减去32。此外,使用这些标准函数的C代码将在具有非ASCII字符编码的系统上工作。
https://stackoverflow.com/questions/41895285
复制相似问题