C 中的 if 结构会影响变量的值吗?



我试图编写一个简单的 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"时,输出变为空格,当输入数字和信号时,只会获得不同的输出而不是自身。然后我改变了ifs的顺序,第二个问题解决了,但"g"问题仍然存在。

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

该函数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表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 中很难从头开始。这是因为字符编码留给实现。ASCII很常见,但绝不无处不在。幸运的是,C 标准库提供了您需要的函数,函数名称使它们具有自我文档:

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

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

同样,getchar返回一个 int,但你假设它返回一个char

因此,您可能希望尝试将a声明从char更改为int

最新更新