C语言 切换字符串中每个字母的大小写

kpbwa7wx  于 2023-03-01  发布在  其他
关注(0)|答案(6)|浏览(139)
#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;   
}

出现了一个问题:
您已经获得了一个由大写和小写英文字母组成的字符串。您需要更改此字符串中每个字母的大小写。也就是说,所有大写字母都应转换为小写字母,所有小写字母都应转换为大写字母。然后,您需要打印生成的字符串以进行输出。
上面的代码有什么问题?它编译成功,但有一个运行时错误。

4jb9z9bj

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

以下是更正后的版本:

#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;   
}
ubof19bj

ubof19bj2#

最明显的问题是字符串没有以null结尾,因此当调用printf("%s", arr)时,行为将不可预测。

xj3cbfub

xj3cbfub3#

你的代码的问题是它从来不终止字符串,如果你读了100个字符,然后你想用%sprintf中打印它们,你必须在末尾添加一个null终止符,如下所示:

char arr[100+1]; // See +1
... // Reading code
arr[100] = '\0';

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

wi3ka0sx

wi3ka0sx4#

为了执行printf("%s", arr),需要使用空字符终止arr
一种方法是:

  • 声明char arr[101]
  • 设置arr[100] = 0
8fq7wneg

8fq7wneg5#

您的代码存在以下问题:非空终止的输入字符串、不正确的小写/大写转换以及与=- / -=和=+ / +=运算符混淆。
下一个代码基于您的代码:
作为获取以空值结尾的字符串的替代方法,它使用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

rkue9o1l

rkue9o1l6#

#include <iostream>
#include<string>
using namespace std;
int main() {
    int i;
    string str;
    cin >> str;    //Reading input from STDIN
    // cout << "Input number is " << i << endl; // Writing output to STDOUT
    for(i=0;i<str.length();i++){
        if((str[i]>='A' && str[i]<='Z')||(str[i]>='a'&& str[i]<='z')){
            if(str[i]>='A' && str[i]<='Z'){
                str[i]=str[i]+32;
                // cout<<str[i];
            }
            
            else if(str[i]>='a' && str[i]<='z'){
                str[i]=str[i]-32;
            }
                
            cout<<str[i];   
        }
    }

}

相关问题