【问题标题】:Does if-structure in C affect the value of variable?C中的if结构会影响变量的值吗?
【发布时间】:2020-01-19 11:02:22
【问题描述】:

我正在尝试编写一个简单的 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 的值;我很困惑,想知道如何。

【问题讨论】:

  • 不要使用幻数。如果你想写下“字母A的字符代码”,它在C中拼写为'A'。不是65或任何东西。更好的是,使用内置函数islowerisuppertolowertoupper
  • 假设 ASCII 编码字符,了解它们及其值应该会有所帮助。只是不要写那样的代码!它很难辨认,而且使用magic numbers,而且通常是不可移植的并且(事实证明)错误。要转换大小写,请使用touppertolower
  • 哦,记住getchar返回一个int。如果您想检查错误或文件结尾,这实际上很重要。
  • 无法复制,见ideone.com/pk4zVS
  • 话虽如此,你的代码appears to be working with minimal changes(char a 需要是 int a 以便检查 getchar() 的状态是可能的)。字母g或其他任何东西似乎没有问题。请发布minimal reproducible example,其中包括完整的可构建程序和违规输入。

标签: c char scanf getchar


【解决方案1】:

函数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;
}

【讨论】:

  • c - 'A' + 'a' 和 c - 'a' + 'A' 是更自我记录的 tolower 和 toupper。
  • @mevets 我使用了问题作者的方法。
【解决方案2】:

首先,为了可读性,(并帮助您查看您的代码在做什么。)使用 _ASCII tablechar 值替换代码中的幻数(例如:' 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()picks up unwanted content,请使用更精确的方式来读取您的输入。

替换

a = getchar();  

scanf(" %c", &a);

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • OP 不寻求帮助以可移植的方式翻译字符。他们在问为什么a 的值在if 语句中似乎发生了变化。在问题中显示的代码中,它没有。他们正在使用其他一些代码,并且没有提供可重现的示例。此答案未解决所提出的问题。
    【解决方案4】:

    据我了解,putchar 接受 int,但你给它一个 char

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 2020-11-25
      相关资源
      最近更新 更多