所以在這里,我想解決我的基礎編程課中的一個問題。所以,問題是,我們應該計算元音字母并列印字串中有多少個 A/a、I/i、U/u、E/e 和 O,o 字母。在這種情況下,我使用 ASCII 來檢查字母。所有程式都運行得很好,但我發現了一個問題。我的程式無法計算 I/i 字母。盡管我輸入了一個“I”字母,但總是計數為零。你能幫我修一下嗎?
#include <stdio.h>
#include <string.h>
int main () {
int len, a = 0, i = 0, u = 0, e = 0, o = 0;
char str[150];
scanf("%[^\n]s", &str);
len = strlen(str);
for(int i = 0; i <= len; i ){
if(str[i] == 65 || str[i] == 97){
a ;
continue;
}
if(str[i] == 73 || str[i] == 105){
i ;
continue;
}
if(str[i] == 85 || str[i] == 117){
u ;
continue;
}
if(str[i] == 69 || str[i] == 101){
e ;
continue;
}
if(str[i] == 79 || str[i] == 111){
o ;
continue;
}
}
printf("A/a : %d\n", a);
printf("I/i : %d\n", i);
printf("E/e : %d\n", e);
printf("U/u : %d\n", u);
printf("O/o : %d\n", o);
}
uj5u.com熱心網友回復:
您正在隱藏回圈i中的變數。for例如,將回圈索引更改j為 ,它將起作用。
其他幾件事:
- 而不是使用諸如
65and之類的幻數,97我建議使用Aanda。 - 使用
else if將比許多if陳述句和continue.
uj5u.com熱心網友回復:
對于初學者來說,這個電話scanf
scanf("%[^\n]s", &str);
是不正確的。例如,運算式&str具有 typechar( * )[150]而不是 type 的預期引數char *。
你應該寫
scanf("9[^\n]", str);
在這個 for 回圈中
for(int i = 0; i <= len; i ){
宣告的變數i隱藏了在for回圈之前宣告的同名變數。
同樣沒有意義使用條件i <= len代替i < len.
盡管使用該功能strlen是多余的。
并且不要使用幻數,例如65。這使得程式不可讀,而且如果系統支持 EBCDIC 字符表,程式將無法運行。
代替帶有 continue 陳述句的 if 陳述句,使用陳述句會好得多switch。
您的程式可以如下所示
#include <stdio.h>
int main( void )
{
int a = 0, i = 0, u = 0, e = 0, o = 0;
char str[150];
scanf( "9[^\n]", str );
for ( const char *p = str; *p != '\0'; p )
{
switch ( *p )
{
case 'a': case 'A':
a ;
break;
case 'i': case 'I':
i ;
break;
case 'u': case 'U':
u ;
break;
case 'e': case 'E':
e ;
break;
case 'o': case 'O':
o ;
break;;
}
}
printf( "A/a : %d\n", a );
printf( "I/i : %d\n", i );
printf( "E/e : %d\n", e );
printf( "U/u : %d\n", u );
printf( "O/o : %d\n", o );
}
為了使程式更安全,您還可以檢查字串的輸入是否成功,例如
if ( scanf( "9[^\n]", str ) == 1 )
{
for ( const char *p = str; *p != '\0'; p )
{
//...
uj5u.com熱心網友回復:
當您剛剛開始時,所有工具(知識和技術)的櫥柜都非常空曠。您最終會撰寫笨拙的代碼(通常使用復制/粘貼)來嘗試解決問題。這個是正常的。
隨著您獲得經驗,您將了解重用您撰寫的代碼的價值(使其更智能,而不是更笨重)。這就是使用函式出現的地方。可以撰寫、測驗一個有能力的函式,然后將其重新用于類似但不同的目的。
其他答案為使用令牌('A')而不是可能是錯誤的幻數(65)提供了很好的指導,這會導致讀者伸手去拿他們的“解密”表來檢查這些數字。格式說明scanf()符不好,并且沒有防止緩沖區溢位的保護。使用“繼續”而不if/else是非常規的,我不喜歡傳統的升序 A->E->I->O->U 在代碼中的洗牌方式。為什么要讓事情更具挑戰性(并且容易出現錯誤)?
下面的代碼可能看起來很嚇人,但 C 代碼的美妙之處在于您可以一次檢查一行并了解其用途。
#include <stdio.h>
#include <stdlib.h>
void cntThese( char *valid, char *str, int cnts[] ) {
// Passed a string of 'paired' characters,
// a sample string
// and array to use as accumulators.
// When a character is interesting
// pointer arithmetic yields the index of the appropriate accumulator.
char *p;
for( int i = 0; str[i]; i )
if( (p = strchr( valid, str[i] )) != NULL )
cnts[ (p - valid) >> 1 ] ;
}
int main() {
char *str = "{Twas BRILLIG <<<and>>> { [[the]] (ugly) slithy toves} }";
int i, cnt[ 32 ]; // big enough accumulator array
char *vowels = "AaEeIiOoUu"; // count the vowels (case insensitive)
memset( cnt, 0, sizeof cnt ); // zero the counters
cntThese( vowels, str, cnt );
for( i = 0; i < strlen(vowels)/2; i )
printf( "%2.2s - %d times\n", vowels i i, cnt[i] );
char *braces = "{}()[]<>"; // count the braces and brackets
memset( cnt, 0, sizeof cnt ); // zero the counters
cntThese( braces, str, cnt );
for( i = 0; i < strlen(braces)/2; i )
printf( "%2.2s - %d times\n", braces i i, cnt[i]/2 );
return 0;
}
Aa - 2 times
Ee - 2 times
Ii - 3 times
Oo - 1 times
Uu - 1 times
{} - 2 times
() - 1 times
[] - 2 times
<> - 3 times
你可以想象,現在計算字母表中 26 個字母中每一個字母的出現次數,或者你想到的任何目的是多么容易。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/512370.html
上一篇:變數i在顯示時遞增
下一篇:這個for回圈陣列是如何作業的?
