C言語の課題で、キーボードから文字列を入力し,その文字列の全文字数,小文字の数,大文字の数,数字文字の数,それ以外の文字の数,をそれぞれ表示し、大文字ならば小文字に、小文字ならば大文字に、数字ならばそのまま、その他ならば ‘=’ にする問題です。
(strlen(), islower(), isupper(), isdigit() ,tolower(), toupper() の関数を使用)
--------------------------------------------
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void){
char st[100];
char c;
int i,n,c_l,c_u,c_d,c_f;
printf("文字列を入れてください ");
gets(st);
n = strlen(st);
c_l = c_u = c_d =c_f= 0;
c=st;
for (i = 0; i <= n; i++){
if (islower(st)) {
c_l++;
st = toupper(c);
}
else if (isupper(st)){
c_u++;
st = tolower(c);
}
else if (isdigit(st)) c_d++;
else{
c_f++;
st = '=';
}
}
printf("全文字数 %d 小文字 %d 大文字 %d 数字 %dその他 %d\n", n,c_l, c_u, c_d,c_f);
printf("変換後の文字列は %s\n",st);
return 0;
}
---------------------------------
文字列を入れてください Abc 123 !"# Def
全文字数 15 小文字 4 大文字 2 数字 3その他 7
変換後の文字列は aAA=123=====aAA=
続行するには何かキーを押してください . . .
---------------------------------
となり、本来なら、その他が6で文字列は「aBC=123=====dEF」になるはずなのに上手くいきません。どこが間違っているのか教えてください。
c言語.課題 どこが間違っているのか教えてください
Re: c言語.課題 どこが間違っているのか教えてください
- フォーラムルールに反して、BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲まずにソースコードを貼り付けている
- 文字数(strlenで返される)がnなのに、0~nまでのn+1回のループを回しているため、終端のナル文字まで誤って処理の対象になっている
- if文の条件ではちゃんとstを使っているのに、変換するときにはなぜかループ中は更新されないcを使ってしまっている
- (バッファオーバーランが防げず危険と言われ、C99で非推奨、C11で削除となったgets関数を使っている)
というところが間違っていますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: c言語.課題 どこが間違っているのか教えてください
どこが間違っているのかを教えてくれるコンパイラが
多いんですが、何もメッセージが出ませんか?
使っているコンパイラは何ですか?
大文字小文字が変なのだから、xyz や XYZ などの
テストデータも試してみてはいかがですか?
問題が早く解決するように、上記の質問への
答えをお待ちしています。
それから、islower, isupper, tolower, toupper の引数
は、unsigned char または EOF の値でないといけなくて、
それは、0~255 または -1 であることが多いのですが、
char str[100]; や char c; と宣言すると、str や c
が -128~127 になることがあって、islower(c) などが
未定義動作となる可能性があります。
今回の問題には無関係ですが、unsigned char c; と
宣言して、それを使ったほうが無難です。
多いんですが、何もメッセージが出ませんか?
使っているコンパイラは何ですか?
大文字小文字が変なのだから、xyz や XYZ などの
テストデータも試してみてはいかがですか?
問題が早く解決するように、上記の質問への
答えをお待ちしています。
それから、islower, isupper, tolower, toupper の引数
は、unsigned char または EOF の値でないといけなくて、
それは、0~255 または -1 であることが多いのですが、
char str[100]; や char c; と宣言すると、str や c
が -128~127 になることがあって、islower(c) などが
未定義動作となる可能性があります。
今回の問題には無関係ですが、unsigned char c; と
宣言して、それを使ったほうが無難です。
Re: c言語.課題 どこが間違っているのか教えてください
「C++Builder」で実行しました。単なる勘違いだと思いますけど。(^^;
http://www2.koyoen.birdview.co.jp/~abcxyz/m.jpg
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void){
char st[100];
char c;
int i,n, c_l,c_u,c_d,c_f;
printf("文字列を入れてください ");
gets(st); printf("◆dt=%s\n\n",st);
n = strlen(st); printf("◆n=%d\n\n",n);
c_l = c_u = c_d =c_f= 0;
c=st[i];
for (i = 0; i < n; i++){
if (islower(st[i])) {
c_l++;
st[i] = toupper(st[i]);
}
else if (isupper(st[i])){
c_u++;
st[i] = tolower(st[i]);
}
else if (isdigit(st[i])) c_d++;
else{
c_f++;
st[i] = '=';
}
}
printf("全文字数 %d 小文字 %d 大文字 %d 数字 %dその他 %d\n", n, c_l, c_u, c_d, c_f);
printf("変換後の文字列は %s\n",st);
gets(st);
return 0;
}