2016-09-12 12 views
-1

varibleをcharと宣言し、文字列 "%s"としてスキャンするたびに、出力コンソールがクラッシュします。ここで、インデックスは、次に、printf("%s\n",toupper(a[i]));undefined behaviorを呼び出すバインドアクセスの外になり、オフすることにより、一点に発生することがありforループ本体内のコードコードブロックの出力コンソールが動作を停止しました

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
int main() 
{ 
    char a[20]; 
    int i; 
    printf("Enter a name "); 
    scanf("%s",&a); 
    for(i=0;i<strlen(a);i++) 
    { 
     a[i] = toupper(a[i]); 
     i++; 
     printf("%s\n",toupper(a[i])); 
    } 
    return 0; 
} 
+0

'のscanf( "%sの" &a);は' - > 'のscanf( "%の19S"、&a); ' –

答えて

2

i++;あります。

i++はループ本体の内側から削除できます。

次に、toupper(a[i])%sフォーマット指定子では無効なintを返します。この指定子はUBを再度呼び出します。過度に長い入力からバッファオーバーフローを防ぐために

  • 言っ

    は、それはあなたが配列のアドレスを渡す必要はありません、scanf()

  • を入力の長さを制限するのが最善です

    だから、

、全体的に、あなたは

を記述する必要があり、単に配列名で十分です0
scanf("%19s",a); 
+0

'のscanf( "%の19S"、&a);は' 'のscanf( "%の19S"、A)であるべきです。文字列が入力された場合、 '。 – mch

+0

@mchのおかげで、指摘した。:) :)たくさん –

+0

おかげで、ところでこのコードの出力はBA一定のパターンに想定され、朝、予想される出力は朝 朝 朝 朝 朝でなければなりません MORNINg 朝 –

1

toupperを使用して印刷するループに2つの問題があります。

最初に、ループ内の変数iを2回インクリメントすることです。

第二の問題は、printfです:ここでは

printf("%s\n",toupper(a[i])); 

あなたは文字列を印刷するprintfを頼むが、引数として、あなたはそれを(intを返しtoupper実際int、)単一の文字を与えます。単一の文字を印刷するには、"%c"形式指定子を使用します。

ちなみに、前の割り当てのために、文字は既に大文字である必要があるため、印刷するときはtoupperに電話する必要はありません。

0

あなたの印刷ループはミスな振舞い、あなたに未定義の動作を与えることである。

printf("%s\n",toupper(a[i])); 

char *ないプレーンなcharを必要printf()%s書式指定子にtoupper(a[i])を通過しています。これは未定義の動作を引き起こします。ない点ではなく、大文字に文字列全体を変換し、各文字の一つ一つを印刷するにはありません

、その後、一度それを印刷:それが取るとintを返しますので、toupper()周り

for(i = 0; a[i] != '\0'; ++i) 
{ 
    a[i] = (char) toupper((unsigned char) a[i]); 
} 
printf("%s\n", a); 

キャストが時々必要とされ、文字の変換時には注意が必要です。

strlen()への呼び出しを因数分解したことに注目してください。これは少し「賢い」かもしれませんが、このコードが書かれていると思います。文字をループする場合は、長さを別々に計算する必要はありません。

関連する問題