【问题标题】:Issue while taking a series of character as input and converting the case in C将一系列字符作为输入并在 C 中转换大小写时出现问题
【发布时间】:2022-01-25 08:53:20
【问题描述】:

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

#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*
*;
[

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

预期输出:

t
T
H
h
j
J
;

【问题讨论】:

  • 旁注:您可以使用标准库函数islower 来确定字符是否为小写字母字符。您可以使用isupper 来确定字符是否为大写字母字符。您可以使用函数tolowertoupper 转换大小写。
  • 旁注继续:函数isalpha也可能有用。

标签: c character


【解决方案1】:

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

\n 字符的十进制 ascii 值为10if 条件 (c&lt;97) 评估为 true32 添加到 10 导致 42 这是 * 字符的十进制 ascii 值。因此,您将在输出中获得 * 字符。

当您输入 ; 字符时,; 的十进制 ASCII 为 59if 条件 (c&lt;97) 评估为 true32 被添加到 59 导致 @987654344 @和十进制值91的ASCII字符是[。因此,在输入 ; 时,您会得到 [ 字符。

不要只检查if(c&lt;97) 是否为大写,而是将其更改为if ((c&gt;=65) &amp;&amp; (c&lt;=90))。对于小写字符也是如此,不要检查if(c&gt;=97),而是将其更改为if ((c&gt;=97) &amp;&amp; (c&lt;=122))

注意getchar() 的返回类型是int 而不是char。所以c的类型应该是int

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

您还应该添加对EOF 的检查,因为getchar() 在失败时返回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;
}

【讨论】:

    【解决方案2】:

    您的代码存在一些问题。

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

    【讨论】:

    • 非常感谢!!现在工作正常。
    • @Learner 如果答案对您有帮助,请点赞。如果它完全回答了您的问题,请接受它。我们在这里为布朗尼点工作:-)
    • @Learner:如果其中一个答案解决了您的问题,那么您可能需要考虑接受其中一个答案。有关更多信息,请参阅此官方帮助页面:What should I do when someone answers my question?
    猜你喜欢
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多