切换字符串

时间:2017-01-27 13:37:32

标签: c

#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打印到输出。

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

5 个答案:

答案 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