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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bell-chan

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

#1

投稿記事 by bell-chan » 7年前

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」になるはずなのに上手くいきません。どこが間違っているのか教えてください。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 7年前

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

というところが間違っていますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

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

#3

投稿記事 by かずま » 7年前

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

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

大文字小文字が変なのだから、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; と
宣言して、それを使ったほうが無難です。

Math

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

#4

投稿記事 by Math » 7年前

「C++Builder」で実行しました。単なる勘違いだと思いますけど。(^^;

コード:

#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

返信

“C言語何でも質問掲示板” へ戻る