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 );
此外,使用 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 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);
}
我正在尝试编写一个简单的 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 );
此外,使用 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 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);
}