合計 昨日 今日

c言語.課題 どこが間違っているのか教えてください

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: bell-chan
[URL]
Date: 2018年1月14日(日) 13:08
No: 1
(OFFLINE)

 c言語.課題 どこが間違っているのか教えてください

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[i];
for (i = 0; i <= n; i++){
if (islower(st[i])) {
c_l++;
st[i] = toupper(c);
}
else if (isupper(st[i])){
c_u++;
st[i] = tolower(c);
}
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);
return 0;
}
---------------------------------
文字列を入れてください Abc 123 !"# Def
全文字数 15 小文字 4 大文字 2 数字 3その他 7
変換後の文字列は aAA=123=====aAA=
続行するには何かキーを押してください . . .
---------------------------------

となり、本来なら、その他が6で文字列は「aBC=123=====dEF」になるはずなのに上手くいきません。どこが間違っているのか教えてください。

Name: みけCAT
[URL]
伝説なるハッカー(689,686 ポイント)
Date: 2018年1月14日(日) 15:03
No: 2
(ONLINE)

 Re: c言語.課題 どこが間違っているのか教えてください

  • フォーラムルールに反して、BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲まずにソースコードを貼り付けている
  • 文字数(strlenで返される)がnなのに、0~nまでのn+1回のループを回しているため、終端のナル文字まで誤って処理の対象になっている
  • if文の条件ではちゃんとst[i]を使っているのに、変換するときにはなぜかループ中は更新されないcを使ってしまっている
  • (バッファオーバーランが防げず危険と言われ、C99で非推奨、C11で削除となったgets関数を使っている)
というところが間違っていますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: かずま
[URL]
Date: 2018年1月14日(日) 17:54
No: 3
(OFFLINE)

 Re: c言語.課題 どこが間違っているのか教えてください

どこが間違っているのかを教えてくれるコンパイラが
多いんですが、何もメッセージが出ませんか?

使っているコンパイラは何ですか?

大文字小文字が変なのだから、xyz や XYZ などの
テストデータも試してみてはいかがですか?

問題が早く解決するように、上記の質問への
答えをお待ちしています。

それから、islower, isupper, tolower, toupper の引数
は、unsigned char または EOF の値でないといけなくて、
それは、0~255 または -1 であることが多いのですが、
char str[100]; や char c; と宣言すると、str[i] や c
が -128~127 になることがあって、islower(c) などが
未定義動作となる可能性があります。
今回の問題には無関係ですが、unsigned char c; と
宣言して、それを使ったほうが無難です。

Name: Math
[URL]
Date: 2018年1月15日(月) 07:58
No: 4
(OFFLINE)

 Re: c言語.課題 どこが間違っているのか教えてください

「C++Builder」で実行しました。単なる勘違いだと思いますけど。(^^;
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#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;
}


http://www2.koyoen.birdview.co.jp/~abcxyz/m.jpg


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[17人]