将一系列字符作为输入并在 C 中转换大小写时出现问题

Issue while taking a series of character as input and converting the case in C

嘿,我是编程初学者,我需要帮助来解决这个问题。 我正在编写一个代码来输入一个字符并将其转换为相反的大小写(如果是小写则转换为大写,反之亦然),该代码应该在用户输入分号(;)时终止。

#include<stdio.h>
int main(int argc, char const *argv[])
{
    /* code */
    char c;
    while(1)
    {
        c=getchar();
        if(c<97)
        {
            printf("%c",c+32);
        }
        if(c>=97)
        {
            printf("%c",c-32);
        }
        if(c == ';')
        {
            break;
        }
    }
    return 0;
}

我得到的输出:

t
T*
*H
h*
*j
J*
*;
[

问题 - 输入第一个字符后,当我按回车键时,它会转换为大写,这很好,但我也得到一个星号 (*)。再次输入下一个字符,当我按下回车键时,我得到 *.另外,当我按下时;该程序确实终止但它打印“[”。 你能帮我解决这个问题吗,我不确定为什么 * 和 [ 会出现在 O/P.

预期输出:

t
T
H
h
j
J
;

您的代码存在一些问题。

  1. 你应该检查终止 ; 在你转换字符之前
  2. 您不应该对 ASCII 值进行硬编码;而是使用 'a''z''A''Z' 等。
  3. 您应该同时检查上限和下限。这将阻止您尝试转换 \n(换行符)字符(这是 * 的来源:\n 的 ASCII 代码是 10*42).

在输出中得到 * 字符的原因是输入一个字符后你必须按下 ENTER 键,这意味着输入缓冲区中有两个字符 - 你输入的字符后跟 \n 字符。您输入的字符将转换为相反的大小写并打印,当再次调用 getchar() 时,它会从输入缓冲区中读取 \n 字符。

\n个字符的十进制ascii值是10if 条件 (c<97) 的计算结果为 true 并且 32 被添加到 10 导致 42 这是 [=12 的十进制 ascii 值=] 字符。因此,您在输出中得到 * 个字符。

当您输入;字符时,;的十进制ASCII为59if条件(c<97)计算为true并且32 加到 59 上,结果是 91,十进制值 91 的 ASCII 字符是 [。因此,输入 ;.

时会得到 [ 字符

不要只检查 if(c<97) 是否为大写,而是将其更改为 if ((c>=65) && (c<=90))。同样是小写字符,而不是检查 if(c>=97),将其更改为 if ((c>=97) && (c<=122)).

请注意 getchar() 的 return 类型是 int 而不是 char。所以,c 的类型应该是 int:

int c;   // changed type from char to int
while(1)
{
    c = getchar();
......

您还应该添加对 EOF 的检查,因为 getchar() returns EOF 失败。也就是说,您可以用 while ((ch = getchar()) != EOF) 代替 while(1)

把这些加起来,可以做到:

#include <stdio.h>
#include <stdlib.h>
 
int main (void)
{ 
    int ch;

    while ((ch = getchar()) != EOF) {
        if ((ch >= 65) && (ch <= 90)) {
            printf ("%c\n", ch + 32);
        } else if ((ch >= 97) && (ch <= 122)) {
            printf ("%c\n",ch - 32);
        } else if(ch == ';') {
            break;
        }
    }

    /* If loop not terminated due to ';' character 
       then check for EOF and error */
    if (ch != ';') {
        /* Test reason for reaching EOF. */
        if (feof (stdin)) {
            /* if failure caused by end-of-file condition */
            printf ("End of file reached\n");
        } else if (ferror (stdin)) {
            /* if failure caused by some other error */
            perror ("getchar() failed");
            exit (EXIT_FAILURE);
        }
    }

    return 0;
}