新明解C言語 演習11-8

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
vayacy
記事: 2
登録日時: 7年前

新明解C言語 演習11-8

#1

投稿記事 by vayacy » 7年前

初投稿です。
質問は文字列の中の数字を削除する関数を作れという問題で

コード:

/*文字列中の数字を消去する関数*/
void del_digit(char *str)
{
	int i,j;
	int len=strlen(str);
	for(i=0;i<len;i++){
		if(toupper(*(str+i))==tolower(*(str+i))){
			for(j=i;j<len;j++){
				*(str+j)=*(str+j+1);
				}
				i--;
		}
	}
}

int main(void)
{
	char str[128];
	
	printf("文字列:");
	scanf("%s",str);

	del_digit(str);
	printf("%s",str);
	
	return 0;
}
と書いてcygwinで実行したのですが、文字入力までしか実行できなく止まってしまいます。できれば数字の大文字と小文字が同じであることを使いたいんですけど何か間違いがあればご指摘ください。

ちなみにdel_digit内のifの条件式を"=="→"!="に変えてえ実行すると数字だけ残るように実行されてきっちり実行されます…

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

Re: 新明解C言語 演習11-8

#2

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

終端のナル文字も「大文字と小文字が同じ」と判定されるので、
ナル文字を削除しようとし続け、無限ループになってしまうようですね。
文字を削除したら当然文字数が減るので、文字を削除したらlenもデクリメントするようにするといいでしょう。
オフトピック
vayacy さんが書きました:
7年前
できれば数字の大文字と小文字が同じであることを使いたいんですけど
vayacyさんが使いたいのであれば無理にやめろとは言いませんが、
どうしてisdigitを使わずにわざわざそんな独創的な方法をとりたいのでしょうか…?
それと、数字以外にも(記号など)「大文字と小文字が同じ」になる文字はありますよ。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 新明解C言語 演習11-8

#3

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

数字だったら、その後ろ全部をずらす、というのは無駄ですね。
数字でない文字を 1文字コピーするだけでよいでしょう。

コード:

void del_digit(char *str)
{
	unsigned char c;                   // isdigit の引数は unsigned char
	int i = 0, j = 0;                  // コピー元の位置とコピー先の位置
	while ((c = str[i++]) != '\0')
		if (!isdigit(c)) str[j++] = c; // 数字でなければ、コピー
	str[j] = '\0';
}

vayacy
記事: 2
登録日時: 7年前

Re: 新明解C言語 演習11-8

#4

投稿記事 by vayacy » 7年前

間違いに気づけました。ありがとうございました。
あとこのコードを書いたときは学習が進んでおらずisdigitやisalfaを知らなかったのでこじつけて作ったらこんなややこしくなりました(笑)

返信

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