プロが教えるわが家の防犯対策術!

C言語で小文字を大文字に変えるプログラムを造ったのですが、エラーが出てしまいます。 どこが間違っているのか教えてください。

#include<stdio.h>

main()

{
char a[100];
scanf(%c,&a[i]);
int i=0;
while(i<100){
i++;
if(a[i]>60){
printf("%x-20",a[i]);
}else{
printf("%x",a[i])
}
}
}

A 回答 (5件)

小文字から大文字にするときは、toupperを使いましょう。

    • good
    • 0

他の方の回答にもあったようですが、


int i=0;
の後、
while(i<100){
としてから、すぐ、
i++;
してますね?
すると、iは最後は100になるわけです。
その時点で、a[i]が添え字の範囲オーバーです。
i++ はループの最後でないと・・・。
とはいえ、このような場合は、whileでなく、for文を使うべきではないかと・・・。
    • good
    • 0

プログラム的に正しいという意味であれば、



#include <stdio.h>
#include <ctype.h>

int main(void)
{
 char a[100];
 scanf("%99[^\n]", a);
 for (int i = 0; a[i] != '\0'; i++) {
  printf("%c", toupper((unsigned char)a[i]));
 }
}

こんな感じではないでしょうか?

処理系不明の状況ですので...

・mainの仮引数並びはvoidにすべきです。
・mainの返却型はintでなければなりません。
・100文字未満の(空白を含む)文字列をscanfで入力するための書式は%99[^\n]であり、二重引用符が必須です。
・ループは文字列中のナル文字を見つけた時点で抜けるようにしなければなりません。
・文字コード不明なので、小文字かどうかを値で判定することはできません。
・文字コード不明なので、小文字→大文字変換は計算で行うことができません(toupperを使用すべき)。
・printf("%x",a[i])にセミコロンが抜けています。また、書式は%cとすべきです。

なお、ブロックの途中での宣言は問題ありません。main関数にreturn文がない場合は0が返されることが規定されています。
ただし、古い規格ではそうはなっていないので要注意です。
    • good
    • 0

#1です。



質問のプログラムは、
・main()
 main関数はこのままの記載では int main(void) と同じ事。
 何も返さないなら void main(void) にする。
・scanf(%c,&a[i]);
 書式を指定するときは、""で括る。
・int i=0;
 変数の宣言は、最初に実行する。
・printf("%x",a[i])
 セミコロンがない。
とケアレスミスが多すぎます。もっと注意してコーディングしましょう。

で、プログラム的に正しそうなものは、
#include<stdio.h>

void main(){
char a[100];
int i=0;
scanf("%s",&a[i]);
while(i<100){
if(a[i]==0)break;
if(a[i]>96){
printf("%c",a[i]-32);
}else{
printf("%c",a[i]);
}
i++;
}
}

の様になります。
・if(a[i]>60){
 16進数の60を引きたいなら16進数で記述する。(今回は10進数)
・printf("%x-20",a[i]);
 書式を指定するところで -20 としても計算されない。
(10進数に書き直してあります。)
・入力文字列が終わったら終了する。
    • good
    • 0

#include<stdio.h>



void main(){
char a[100];
int i=0;
scanf("%c",&a[i]);
while(i<100){
i++;
if(a[i]>60){
printf("%x-20",a[i]);
}else{
printf("%x",a[i]);
}
}
}

これで、コンパイルエラーはなくなります。
プログラムが正しいかどうかは別問題。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!