嘿,我是編程初學者,我需要幫助來解決這個問題。我正在撰寫一個代碼來輸入一個字符并將其轉換為相反的大小寫(如果它是小寫然后轉換為大寫,反之亦然),當用戶輸入分號(;)時,代碼應該終止。
#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
;
uj5u.com熱心網友回復:
*在輸出中獲取字符的原因是輸入字符后必須按ENTER鍵,這意味著輸入緩沖區中有兩個字符 - 您輸入的\n字符后跟字符。您輸入的字符被轉換為相反的大小寫并列印,getchar()再次呼叫時它\n從輸入緩沖區讀取字符。
\n字符的十進制 ascii 值為10. 該if條件(c<97)評估為true與32被添加到10該結果在42這是十進制ASCII值*的字符。因此,您*在輸出中獲得了字符。
當您輸入;字符時,十進制 ASCII 的;值為59,if條件(c<97)計算為true并與結果32相加,十進制值的 ASCII 字符為。因此,您在輸入.599191[[;
而不是只檢查if(c<97)大寫,將其更改為if ((c>=65) && (c<=90)). 小寫字符也是如此,而不是檢查if(c>=97),將其更改為if ((c>=97) && (c<=122))。
請注意,回傳型別getchar()isint和 not 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;
}
uj5u.com熱心網友回復:
您的代碼存在一些問題。
- 您應該
;在轉換字符之前檢查終止。 - 您不應該對 ASCII 值進行硬編碼;而使用
'a','z','A','Z',等。 - 您應該檢查上限和下限。這將阻止您嘗試轉換
\n(換行符)字符(這是*來自:ASCII 代碼 for\nis10, for*is42)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/393265.html
上一篇:OpenBSD套接字編程
下一篇:這個匯編函式是如何回傳值的?
