我试图编写一个简单的 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 );
此外,使用魔术数字(例如65
或32
(也是一个坏主意。
这是一个演示程序
#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
。