質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

8019閲覧

文字列str内のすべての数字文字を削除する

reotantan

総合スコア295

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/09/02 02:44

str[i-count]=str[i];
}
i++;
}
str[i-count]='\0';
この関数では英文字で数字の列を置き換え、邪魔なものを最後にナル文字で消すという方法をとっていますが、これが特定の文字を消す定石なのでしょうか?
他の方法を知っているかた、また考え付く方は教えてください。

#include <stdio.h> void del_digit(char str[]) { unsigned i=0,count=0; while(str[i]){ if(str[i]>='0'&&str[i]<='9'){ count++; } else{ str[i-count]=str[i]; } i++; } str[i-count]='\0'; } int main(void) { char str[128]; printf("type words:" ); scanf("%s",str ); del_digit(str); printf("the content you deleted:%s\n",str ); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こういう方法も・・・

C

1~/test >./a.out 2type words:qwer124r0 3the content you deleted:qwerr 4~/test >./a.out 5type words:12abc345efg0 6the content you deleted:abcefg 7~/test > 8~/test >cat tst12.c 9#include <stdio.h> 10#include <ctype.h> 11 12void del_digit(char *str) 13{ 14 char *sp= str; 15 char *ep= str; 16 17 while (*ep) { 18 while(isdigit(*ep)) { 19 ep++; 20 } 21 *sp++ = *ep++; 22 } 23 *sp = '\0'; 24} 25 26int main(void) 27{ 28 char str [128]; 29 30 printf("type words:"); 31 scanf("%s", str); 32 33 del_digit(str); 34 printf("the content you deleted:%s\n", str); 35 return 0; 36 37} 38~/test >

投稿2015/09/02 03:46

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/09/02 04:21

~/test >./a.outというのはwindowsでも使えますか、また意味を教えてください
cateye

2015/09/02 04:33 編集

a.outはunix系の実行ファイル名(Assembler outの略:実行ファイル名を指定しないでコンパイルすると出来る)です。windowsのgcc環境であればa.exeが出来ると思います(うろ覚え^^;)。
reotantan

2015/09/02 08:04

なるほど、ありがとうございます。
cateye

2015/09/02 11:06 編集

バグがあります・・^^; void del_digit(char *str) { char *sp= str; char *ep= str; while (*ep) { while(isdigit(*ep)) { ep++; } // 以下を追加 if( *ep == '\0'){ break; } // *sp++ = *ep++; } *sp = '\0'; } 最後の文字が数字の場合&'\0'の後にごみが入っている(普通はそうです)場合、*sp++ = *ep++;で'\0'の次にポインタが進んでしまうため、次に'\0'を見つけるまでループします(スタックオーバフロー)・・・申し訳ありませんmm
guest

0

strtokの第一引数に"0123456789"を指定して分割した後、strcatで連結するという方法はすぐに思いつきます。
ただ、問題文のコードの方が明らかに効率が良いです。

投稿2015/09/02 03:02

hy3

総合スコア594

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/09/02 08:04

そうですか、そんな方法もあるんですね。 ありがとうございます
guest

0

数字かどうか判定するには、isdigit関数を使います。
isdigitctype.hヘッダーファイルに定義されています。

lang

1 if(isdigit(str[i])){

それ以外は割と普通の方法だと思います。

投稿2015/09/02 02:59

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reotantan

2015/09/02 08:05

それは知らなかったです。 ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問