首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在字符串中切换每个字母的大小写

在字符串中切换每个字母的大小写
EN

Stack Overflow用户
提问于 2017-01-27 13:37:32
回答 5查看 572关注 0票数 3
代码语言:javascript
复制
#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;   
}

有一个问题:

你得到了一个由大写字母和小写字母组成的字符串。您需要更改此字符串中每个字母表的大小写。也就是说,所有大写字母应转换为小写字母,所有小写字母应转换为大写字母。然后,需要打印出要输出的结果字符串。

上面的代码有什么问题?它正在成功编译,但存在一个运行时错误。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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不是空终止的。

以下是修正后的版本:

代码语言:javascript
复制
#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;   
}
票数 4
EN

Stack Overflow用户

发布于 2017-01-27 13:40:46

最明显的问题是,您不是空终止字符串,所以当您调用printf("%s", arr)时,行为将是不可预测的。

票数 2
EN

Stack Overflow用户

发布于 2017-01-27 13:41:45

代码的问题是它永远不会终止字符串。如果读取100个字符,然后要用%sprintf中打印这些字符,则必须在末尾添加一个空终止符,如下所示:

代码语言:javascript
复制
char arr[100+1]; // See +1
... // Reading code
arr[100] = '\0';

注意,库函数islower/isupper提供了一种可移植的、更易读的测试字符类型的方法。类似地,tolower/toupper向您的代码读者提供了更多关于您的意图的信息,而不是简单地添加和减去32。此外,使用这些标准函数的C代码将在具有非ASCII字符编码的系统上工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41895285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档