将一系列字符作为输入并在 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
;
您的代码存在一些问题。
- 你应该检查终止
;
在你转换字符之前。
- 您不应该对 ASCII 值进行硬编码;而是使用
'a'
、'z'
、'A'
、'Z'
等。
- 您应该同时检查上限和下限。这将阻止您尝试转换
\n
(换行符)字符(这是 *
的来源:\n
的 ASCII 代码是 10
,*
是 42
).
在输出中得到 *
字符的原因是输入一个字符后你必须按下 ENTER
键,这意味着输入缓冲区中有两个字符 - 你输入的字符后跟 \n
字符。您输入的字符将转换为相反的大小写并打印,当再次调用 getchar()
时,它会从输入缓冲区中读取 \n
字符。
\n
个字符的十进制ascii值是10
。 if
条件 (c<97)
的计算结果为 true
并且 32
被添加到 10
导致 42
这是 [=12 的十进制 ascii 值=] 字符。因此,您在输出中得到 *
个字符。
当您输入;
字符时,;
的十进制ASCII为59
,if
条件(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;
}
嘿,我是编程初学者,我需要帮助来解决这个问题。 我正在编写一个代码来输入一个字符并将其转换为相反的大小写(如果是小写则转换为大写,反之亦然),该代码应该在用户输入分号(;)时终止。
#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
;
您的代码存在一些问题。
- 你应该检查终止
;
在你转换字符之前。 - 您不应该对 ASCII 值进行硬编码;而是使用
'a'
、'z'
、'A'
、'Z'
等。 - 您应该同时检查上限和下限。这将阻止您尝试转换
\n
(换行符)字符(这是*
的来源:\n
的 ASCII 代码是10
,*
是42
).
在输出中得到 *
字符的原因是输入一个字符后你必须按下 ENTER
键,这意味着输入缓冲区中有两个字符 - 你输入的字符后跟 \n
字符。您输入的字符将转换为相反的大小写并打印,当再次调用 getchar()
时,它会从输入缓冲区中读取 \n
字符。
\n
个字符的十进制ascii值是10
。 if
条件 (c<97)
的计算结果为 true
并且 32
被添加到 10
导致 42
这是 [=12 的十进制 ascii 值=] 字符。因此,您在输出中得到 *
个字符。
当您输入;
字符时,;
的十进制ASCII为59
,if
条件(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;
}