C中的if-structure会影响变量的值吗?

Does if-structure in C affect the value of variable?

我正在尝试编写一个简单的 C 程序来转换字母的大小写

char a;
a = getchar();
if(a<=90&&a>=65)
    putchar(a+32);
else if(a<=122&&a>=97)
    putchar(a-32);
else
    putchar(a);

当输入'A'或'c'时,输出是正确的;但是,当输入'g'时,输出变为space并且输入数字时和信号,只得到不同的输出而不是 itself.Then 我改变了 ifs 的顺序,第二个问题解决了,但 'g' 问题仍然存在。

但我认为 if 结构不会改变 a 的值;我很困惑,想知道如何。

据我了解,putchar 需要一个 int,但你给它一个 char

同理,getchar return是一个int,但是你假设它是return一个char

所以您可能想尝试将 a 的声明从 char 更改为 int

函数 getchar 从输入流中读取所有符号,包括空格。

改用

scanf( " %c", &a );

此外,使用 6532 等幻数也是个坏主意。

这是一个演示程序

#include <stdio.h>

int main(void) 
{
    char c;

    while ( scanf( " %c", &c ) == 1 )
    {
        if ( 'A' <= c && c <= 'Z' )
        {
            putchar( c | ' ' );
        }
        else if ( 'a' <= c && c <= 'z' )
        {
            putchar( c & ~' ' );
        }
        else
        {
            putchar( c );
        }
    }

    return 0;
}

如果输入例如

A
a
1
G
g
2

那么程序输出将是

aA1gG2

如果使用getchar那么方法可以看下面的方式

#include <stdio.h>
#include <ctype.h>

int main(void) 
{
    int c;

    while ( ( c = getchar() ) != EOF )
    {
        if ( 'A' <= c && c <= 'Z' )
        {
            putchar( c | ' ' );
        }
        else if ( 'a' <= c && c <= 'z' )
        {
            putchar( c & ~' ' );
        }
        else if ( isgraph( ( unsigned char )c ) )
        {
            putchar( c );
        }
    }

    return 0;
}

首先,为了可读性,(并帮助您 查看 您的代码在做什么。)使用 _ASCII table char 值(例如:'A' 而不是 65)和表达式中 32 变量 表示,(个案之间的距离) .
例如:

char a;
a = getchar();    
if(a<=90&&a>=65)
    putchar(a+32);
else if(a<=122&&a>=97)
    putchar(a-32);

char a;
int convert = 32; //distance between cases

a = getchar();
if(a <= 'Z' && a >= 'A')
    putchar(a + convert );
else if(a <= 'z' && a >= 'a')
    putchar(a - convert );

并且由于 getchar() ,请使用更精确的方式来读取您的输入。

替换

a = getchar();  

scanf(" %c", &a);

这在可移植的 C 中很难从头开始。这是因为字符 encoding 留给了实现。 ASCII 很常见,但绝非无处不在。幸运的是,C 标准库提供了您需要的函数,并且函数名称使它们成为自文档:

int a;
a = getchar();    
if (isupper(a)){
    putchar(tolower(a));
} else if (islower(a)){
    putchar(toupper(a));
} else {
    putchar(a);
}