• ベストアンサー

cプログラミングについて

現在c言語を勉強しているのですがどうしてもわからないので質問させてください。 キーボードから不特定多数の文字列を入力した際に、特定の文字に対してのみ特定の処理を施したい場合どうすればよいのでしょう? 例えば、 ・行の先頭の英小文字を英大文字に変換する ・\の後に入力されている数値を100倍にする などです。よろしくお願いします。

  • zzaqq
  • お礼率83% (15/18)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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.

zzaqq
質問者

お礼

おかげさまでうまくいきました どうもありがとうございます

その他の回答 (2)

  • becky_jp
  • ベストアンサー率0% (0/1)
回答No.2

・\の後に入力されている数値を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; } んーなんだか微妙な感じになってしまいました。。。

zzaqq
質問者

お礼

わざわざコードまで書いてくださりどうもありがとうございます。

  • mindatg
  • ベストアンサー率48% (110/227)
回答No.1

行でなく、文字で精査する。 C言語は長らく触ってないのでソースは割愛 基本、getch()でキーボードからの入力を1つ1つ精査します。 ・行の先頭の英小文字を英大文字に変換する 1行目かどうか(改行しているかどうか)を判断する 1行目(改行していない)なら1文字目を大文字にする 以降は、getch()なんかで0x0Dが入ってきたら次は大文字にするようフラグを立てて処理 ・\の後に入力されている数値を100倍にする 「\(確か0x5C)」が入力されたらフラグを立てる 数値が続く限りフラグはONのまま、char配列に格納していく 数値以外は入力されたら、フラグをOFF、atoi(*char)で数値化、100倍にしてitoa() 小数点等を考慮する場合はもうちょっと細かく精査します。 参考程度にどうぞ

zzaqq
質問者

お礼

どうもありがとうございました。

関連するQ&A

  • c言語プログラミングHELP!

    c言語でプログラムを組んでるんですが、どうしてもわからないものがありまして、 まず一つ目がキーボードから英小文字を一つ入力し、その文字を大文字に変換して出力するプログラミングです。結果がまずひとつの英小文字を入力して、入力した文字と、大文字に変換した文字を出力するプログラミングです。 ちなみにヒントは'a'=97,'A'=65です 二つ目が二桁の16進数('41'から'49','50'から'59')を入力すると対応する文字を表示するプログラミングです。また、%xは使用しないこと。なお、入力に間違いはないものとする。(ヒントは入力は一つの数値か、二つの文字か?だそうです。) 結果は二桁の16進数('41'から'49','50'から'59')を入力して、文字コードの二桁の数字と文字を出力するプログラミングです。 お願いします。

  • プログラミングC

    以下に示すプログラムは、キーボードから39文字以下の文字列を入力した後で、その文字列を表示するプログラムである。ただし、文字列の表示においては、printf命令における変換指定で、%sを使用するのが一般的であるが、以下のプログラムあえて%sを使用せずに、%cを使っている。このプログラムについてキーボードから入力される文字列の文字数が391文字以下である限り、その文字列を正しく表示できるよう、下線部を埋めてプログラムを完成させなさい。 char x[40],i printf("39文字以下の文字列を入力:"); scanf("%s",x); for(i=0;x[i]_____;i++) printf("%c",x[i]); printf("です。\n"); [実行例] 39文字以下の文字列を入力:programming 入力された文字列はprogrammingです。

  • C言語のプログラミングですが、

    C言語のプログラミングですが、 255文字以内の文字列をキーボードから入力して、下記の各処理を行うプログラム(※入力した文字データは配列に入力)はどのようにしたらいいでしょうか?(入力例:acFNkeexFFg) ・入力した文字列の最後の文字を出力 ・入力した文字列⇒逆に並べ替えて出力 ・入力した文字列⇒縦に出力(1文字ずつ) ・入力した文字列の中に「F」が何個あるか ただし、使えるのはfor文・配列・if文ぐらいでそれ以上レベルの高いものは使わないで下さい。 … char str[255]; int i,n,na,nb,nc; printf("Input Strings= "); scanf("%s",str); for(i=0;str[i]!='¥0';i++){ n=i; } printf("The last character= %c",str[n]); くらいまでしか分かりません…

  • C言語

    課題なんですが、C言語で 「文字列と正数nをキーボードから入力して、1行n文字で改行するプログラム」 をつくりたいのですが、わかりません。どうすればよいのですか?

  • C言語のプログラミングについてです。

    C言語のプログラミングについて教えて欲しいです。 scanf関数を用いて、キーボードから文字列(最大30文字)を読み込み、これをchar型配列に格納します。最大10個までの文字列が入力された場合か、「END」が入力された時、入力された逆順で画面に表示するプログラム。作成しなさい。 〈完成例〉 adjm 10mdjp jpd-4 njad' END njad jpd-4 10mdjp adjm

  • Cプログラミングについて

    XP環境でVisual C++2008を使ってC言語の プログラミングをしています。 キーボードから複数回読み込み、長い文字列を作るというものです。 例) >>文字列を入力 >>abc >>今まで入力された文字列を表示 >>gsfgsdfgjfsdabc 配列、ポインタ、メモリの確保を行う事がヒントとして与えられています。 これを実現するために以下のようなプログラムを組んでみました。 int InputCount=0; char InputStr[10]; char *OutputStr[5]; int i=0; while(InputCount<5){ printf("文字列を入力してください\n"); scanf("%s",InputStr); OutputStr[InputCount]=(char*)malloc(strlen(InputStr)+1); OutputStr[InputCount]=InputStr; printf("今までに入力された文字を表示します\n"); for(i=0;i<=InputCount;i++){ printf("%s",OutputString[i]); } printf("\n"); InputCount++; } このように組んでみたのですが、うまくいきませんでした。 これでは一度入力した文字列の内容を 保持する事ができないようです。 根本的にアルゴリズムが悪いのではないかとも考えていますが、どうするのが良いのかわかりません。 初心者なので至らない点、情報不足があればご指摘願います。 これではなぜ無理なのか、またどのようなアプローチが良いのかご教授よろしくお願いします。

  • C言語のプログラミングについて

    私は大学2年なのですが、現在留年するかしないかというぎりぎりのところに立っています。好意で単位をなんとかしてくれる教授を探し出し、C言語の宿題を出されました。ですが私は根っからの文型で、プログラミングなどしたこともありません。教科書を図書館で借りて読んでみるものの、すぐ理解できるような難易度ではないことだけがわかりました。 そこでもしよろしければ、プログラムを教えてもらいたいです。 1.キーボードから整数の入力を繰り返す。0以下の値が入力されたら終了し、入力した値の中の最小値を表示する。また、それが何番目に入力された値かもあわせて表示する。(6つの整数を入力、最後の整数は0を入力することとする。) 実行結果例 整数を入力: 6 整数を入力: 5 整数を入力: 4 整数を入力: 3 整数を入力: 2 整数を入力: 1 整数を入力: 0 最小値は6番目の1 2.キーボードから整数の入力を4回繰り返し、それらの値を2次元配列Aの各要素に順に代入し、その行列のそれぞれの要素と行列式を表示するプログラムを作成せよ。 実行結果例 1行1列の要素? 6 1行2列の要素? 5 2行1列の要素? 4 2行2列の要素? 3 行列A = 6 5 4 3 行列式 = 2 3.キーボードから西暦年を入力し,その年が閏年のときは「○○年はうるう年です」と表示し,そうでないならば「○○年はうるう年ではありません」と表示するプログラムを作成しなさい. なお,閏年の定義は以下の通りである. ・西暦年が4で割り切れる年は閏年 ・ただし,西暦年が100で割り切れる年は平年 ・ただし,西暦年が400で割り切れる年は閏年 実行結果例 西暦年を入力してください. 1987 1987 年はXXXXXXXX 一時的ではありますが、皆様のお力をお借りしたいです。 もちろん、ここでお答えをもらってもわからないままにせずに、無事進級することができたら独学で勉強しようとは思ってます。 なお、理系の人たちはVisualBasicというソフトを使っているようです。よろしくお願い致します。

  • プログラミング(C言語)について

    プログラミングの課題です。いろいろ考えたのですがうまくいきません。 文字検索プログラムをC言語で作ろうとしています。多くの文字列(例:ABAABCBBABC・・・)の中から検索したい文字列(例えばABC)を入力して、その文字列が何か所に含まれてそれぞれ何文字目に始まるかを求めるようにするというものです。 どなたかわかる方がいらっしゃいましたらご回答よろしくお願いいたします。できれば詳しく式などを書いていただきたいです。

  • Cについて教えてください。

    学校で 「文字列を繰り返し読み込み、英文字以外を削除し小文字を大文字に  変換して表示するプログラムを作成せよ。'!'を入力したとき終了  するようにすること。」 使う関数などについて指定はなく、第1回目の授業で説明もなく課題が 出てしまいました。他にもあるのですが、それはとりあえずできた。 教科書があるので、そちらを参考にしなさいと言うことだと思います。 教科書…ソフトバンクパブリッシング社 改訂新C言語入門-ビギナー編- 環境はUNIXです。dtpadで入力し、ccでコンパイルしています。 自分なりに考えたのは isalpha(x)を使って英文字を認識してtoupper(x)で文字の変換。 入力はcharでしているのでこれらをintに変換してxに文字コード(10進) を入力すればできるかな~と。 また、「繰り返し~」からwhile(1)で無限ループにして、if(a == '!') break で抜けて終わりかな。 と考えたのですが、うまくプログラムが立てることができず困っています。 ぜひぜひ教えて下さい。

  • C言語 プログラミング 考え方

    何行かの文字列(文字数はすべて一緒)を入力してそれらの文字の縦と横を入れ替える作業の方法が思いつきません。 どなたかアドバイスお願いします!

専門家に質問してみよう