- ベストアンサー
cプログラミングについて
現在c言語を勉強しているのですがどうしてもわからないので質問させてください。 キーボードから不特定多数の文字列を入力した際に、特定の文字に対してのみ特定の処理を施したい場合どうすればよいのでしょう? 例えば、 ・行の先頭の英小文字を英大文字に変換する ・\の後に入力されている数値を100倍にする などです。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
これは、\の後に入力されている数値を100倍にした後をどうするかについて、以外とやっかいな質問です。 ここでは、一括 gets() で読み込み、読み込んだ文字配列を精査して100倍に変換しています。 #include <stdio.h> #include <ctype.h> // islower(),isdigit() #define SPACE 0x20 void enhance(char *); //プロトタイプ宣言 int main(void) { char buff[512]; printf("? "); enhance(gets(buff)); printf("Result: %s\n", buff); return 0; } void enhance(char *p) { char c,*t,*a,*remove; t=p; /* 行の先頭の英小文字を英大文字に変換する */ if(islower(*p)) *p++ -= SPACE; /* \の後に入力されている数値を100倍にする */ while(c=*p){ if(c=='\\') { remove=t=p; while(isdigit(*++p)) *t++=*p; //文字列の拡張(末尾から転送する) if(p>remove+1){ a=p; while(*a++); //ポインター位置を末尾に remove=a+1; //転送先を2バイト後へコピー while(a>=p) *remove--=*a--; //100倍(空いた文字列に埋め込む) *t++='0'; *t++='0'; } } p++; } } ----- 実行結果 ----- ? let's enjoy the programming by not \1, \10 times. Result: Let's enjoy the programming by not 100, 1000 times.
その他の回答 (2)
- becky_jp
- ベストアンサー率0% (0/1)
・\の後に入力されている数値を100倍する については その後に文字列に戻すのか、ただ100倍するのかで ちょっと処理が違ってくるとおもいますが、 とりあえず gets()などで キーボードからの入力文字列を受け取り、 文字列の長さを取得して、 文字列の長さ分だけ各々判定すればよいかと思います。 なんとなくコード書いてみます。 今コンパイラのインストールされていないPCなのでコンパイル通らないかも; #include <stdio.h> #include <string.h> int main (void) { char buffer[1024]; gets(buffer); const int bufferLength = strlen(buffer); bool lineHead = true; // 行の先頭, 最初は行の先頭なのでtrue for (int i = 0; i < bufferLength; ++i) { if (true == lineHead) { if (buffer[i] <= 'z' && buffer[i] >= 'a') { buffer[i] += 26; // アルファベットの数だけ+する } lineHead = false; } else if (buffer[i] == '\n') { // 改行(\n)がきたら行頭フラグをtrueにする lineHead = true; } else if (buffer[i] == '\\') { if (i < bufferLength) //< 最後の文字ではなかったら { // とりあえず数値かどうか判定 ++i; if (buffer[i] >= '0' && buffer[i] >= '9') { // ここで100倍する? } } } } printf("%s", buffer); return 0; } んーなんだか微妙な感じになってしまいました。。。
お礼
わざわざコードまで書いてくださりどうもありがとうございます。
- mindatg
- ベストアンサー率48% (110/227)
行でなく、文字で精査する。 C言語は長らく触ってないのでソースは割愛 基本、getch()でキーボードからの入力を1つ1つ精査します。 ・行の先頭の英小文字を英大文字に変換する 1行目かどうか(改行しているかどうか)を判断する 1行目(改行していない)なら1文字目を大文字にする 以降は、getch()なんかで0x0Dが入ってきたら次は大文字にするようフラグを立てて処理 ・\の後に入力されている数値を100倍にする 「\(確か0x5C)」が入力されたらフラグを立てる 数値が続く限りフラグはONのまま、char配列に格納していく 数値以外は入力されたら、フラグをOFF、atoi(*char)で数値化、100倍にしてitoa() 小数点等を考慮する場合はもうちょっと細かく精査します。 参考程度にどうぞ
お礼
どうもありがとうございました。
お礼
おかげさまでうまくいきました どうもありがとうございます