• ベストアンサー

C言語、単語ごとに改行したい

英文を入力させ、その英文から単語を抜き取るプログラム たとえば、 入力文字:This is a book. 単語: This is a book スペース、カンマ、コロンの時に改行という感じで、このようなプログラムを作りたいのですが、どのような感じに書けばいいでしょうか? わかる方、よろしくおねがいします

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

  • ベストアンサー
  • ency
  • ベストアンサー率39% (93/238)
回答No.7

# 横槍ぎみに失礼します。 strtok() でいけますよね。 第2引数にデリミタを列挙すれば良いわけですし。 たとえば、↓こんな感じ↓ ---------------------------------------- char src[] = "This is a pen, and that is a pencil: Great"; char *dest; dest = strtok( src, " ,:" ); while ( dest != NULL ) { puts( dest ); dest = strtok( NULL, " ,:" ); } ---------------------------------------- 【結果】 This is a pen and that is a pencil Great

bumplove777
質問者

お礼

ありがとうございます、ホントに助かりました^^

その他の回答 (6)

  • ymasan
  • ベストアンサー率45% (16/35)
回答No.6

ANo5.さん 今回質問者さんは、デリミタが複数(空白、カンマ、コロン)あるとおっしゃっているので、strokではその要求を満たせないと思います。

noname#23393
noname#23393
回答No.5

自分で一文字ずつ見るコード書かなくても strtok で一発では? 参考URLにサンプルもあります。

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/strtok.html
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

英文の表記ルールだと、カンマの後には空白一つ、ピリオドの後には空白二つを置くというのが あるはずですが、その辺の扱いはどうなりますか? たとえば hello, world と入力した場合の結果は hello (空行) world のようになってもOKですか? それと、ダブルクォートやシングルクォートで囲まれているのは 空白を含んでいても一つの語として見なさなくても良いのでしょうか?

  • ymasan
  • ベストアンサー率45% (16/35)
回答No.3

区切り文字(デリミタ)が複数なんですね、 ただ単に表示するだけなら、 #include <stdio.h> #include <string.h> #define MAX_LENGTH 256 int main(void) { char buf[MAX_LENGTH]; int i; /* bufには既に文字列が入力済みとします */ len = strlen(buf); /* 文字列の長さを取得 */ if (len > MAX_LENGTH) { /* バッファサイズ以上のときエラー */ fprintf(stderr, "エラー:文字列が長すぎます\n"); return 1; } /* 文字列長だけループ */ for (i=0; i<len; i++) { /* 文字列の空白、コンマ、コロンを改行に置換 */ if (buf[i]==' ' || buf[i]==',' || buf[i]==':') buf[i]='\n'; } /* 文字列を表示 */ printf("%s\n", buf); return 0; } でどうでしょう?(^^

  • shibamu
  • ベストアンサー率50% (10/20)
回答No.2

愚直に書くと char* str = "This is a book"; int i; /* strlenにstring.hのincludeが必要 */ /* 1文字ずつ処理 */ for(i = 0; i < strlen(str); i++){ char ch = str[i]; /* 改行をする場合を判定 */ if(ch == ' ' || ch == ',' || ch == ','){ putchar('\n'); } else{ putchar(ch); } } のような感じではないでしょうか。 「ある引数の文字が、別の引数の文字列の中のいずれかに当てはまる場合場合」という判定を行う関数があったような気もしますが、失念してしまいました。 参考までにどうぞ。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★アルゴリズム ・文字列を左から検査して、スペース、カンマ、コロンの文字の時だけ  改行コード(\n)を出力すればよい。 ・スペース、カンマ、コロン以外の文字は普通に putchar で出力します。 ●サンプル void MyPrint( const char *string ) ←入力した文字列を指定 {  while ( *string != '\0' ){   if ( strchr(" ,:",*string) != NULL ){    putchar( '\n' );   }   else{    putchar( *string );   }   string++;  } } ・以上。おわり。

関連するQ&A

  • プログラミング(C言語)

    改行で区切られた2つの文字列 a1とa2を受け取って、文字列a2に含まれる文字を文字列a1から全部抜き取るという動作をするプログラム(例 文字列a1 This is a her book. 文字列a2 her 実行結果 This is a book.)を作ろうと考えているのですが、なかなか出来ずに困ってます。どなたか教えて下さい。お願いします。

  • Wordで赤字の単語を( )で置換えたい

    Word2010 で英文を書いた時、赤字で書いた単語(文字でなく単語です)を ( ) で置き換えるにはどうすればよいでしょうか。文字を置き換えるなら、「置換」で可能なことは分っていますが、単語単位で置き換えたいのです。 This is a pen. という文章で、pen が赤字だとして、 This is a ( ). のように置き換えたいのです。赤字の単語は文章中に複数あり、これらを一括で置き換えしたいのです。 よろしくお願いします。

  • C言語

    (a) キーボードから入力された文字列をそのままディスプレイに表示するプログラムを作成しなさい。 という問題 #include<stdio.h> main() { char word[1000]; /*文字型の変数の宣言*/ scanf("%s", word); /*キーボードから文字列を入力*/ printf("%s\n", word); /*入力した文字列を出力*/ } と作りましたがこれではコンソール中で文字を打ってからエンターを押さないといけないからといわれ再提出になってしまいました。 エンターを押さないでそのまま出力するということは、できるのでしょうか? あと自分の作ったプログラムではスペースや改行を使うことができないから使えるようにしろと言われてましたがそれわできますか? 変換仕様をかえればいいのですか ほかにもかえる所はありますか?

  • 教えていただけませんか?C言語 文字列について

    学校で文字列のプログラムを組む課題が出ました 以下のような課題です 1つの文字列を読み込んで,ピリオドで改行し出力するプログラムを作成しろ ・読み込む文字列の長さ 最大で80文字 ・文字列の終わりは必ずピリオドで ・文字列の途中に現れるピリオドの次には必ずスペースが続く ・ピリオドに続くスペースは出力しない 例えば Hello. It is fine. Good-bye.  と打つと Hello. It is fine. Good-bye. と表示されるようなプログラムです そして自分で以下のプログラムを組みました ----------------------------------------------------------- #include <stdio.h> #include <string.h> int main(void){ int i; char A[100]; char *a; fgets(A,80,stdin); a = strtok(A, "."); printf("%s.\n",a); while(a != NULL){ a = strtok(NULL,"."); if (a != NULL){ printf("%s.\n",a); } } return 0; } --------------------------------------------------------------- ですがこれだとピリオドの後のスペースと文字列の後によくわからない改行が出力されてしまいます 自分で何とかするべきなのでしょうがどうにもうまく行きません どこをどうすればいいのか教えていただけないでしょうか?

  • Wordの改行について

    wordで英文を入力中に、 例えば、andの場合、aで改行されます。 両端均等にしているのですが、なぜでしょう。     どうすれば、単語単位で改行できるでしょうか。

  • 英文の改行時のカンマの有無がわかりません。

    英文の改行時のカンマの有無がわかりません。 英語でカードを書いているのですが、改行時にカンマは必要なのか、不要なのかがわかりません。 「~filled with A, B and C.」といった文章で、カードのスペース上改行をしなければいけないのですが、 「filled with A B and C.」 なのか 「filled with A, B and C.」 なのかがわからず迷っています。 住所や名刺の書き方では、改行するときはカンマを付けなくていいといったことも聞いた事はありますが、それは他にも適応できることなのでしょうか? 必要か不要かご存知の方、教えて頂けますと幸いです。 どうぞよろしくお願い致します!

  • C言語でプログラムを作成したいのですが・・・

    C言語でプログラムを作成したいのですが・・・ 急ぎです!!!どなたかお教えください 情報処理の授業のレポート課題です 内容は次のようなものです 傾向の分析 ・入力された英文中の、アルファベットの並びについて分析する、以下のようなプログラムを作る ・大文字/小文字は無視して(どちらかに揃えて)考える ・アルファベットの並びで考えて 前 → 後 の順の並びか、後→前の順の並びかを判定し、それぞれの個数を数え、最終的にどちらが多かったかを表示 ・最も出現する回数の多かった、2文字の並びを表示する ・スペースとピリオドは無視する 例: This is a pen. ・thisisapen と考える ・th:後→前, hi: 前→後, is:前→後 ... ・前→後: 5回, 後→前:4 回 なので前→後の方が多い ・一番多く出現している並びは is お願いします

  • excelでの改行制御

    例えば、123456-789abcdefg をセルに入力し、「折り返して表示」の状態で、セル幅が例えば9とaの間で切れるくらいの幅である場合でも、"-"のところで改行され、 123456- 789abcdefg と表示されます。 これは、"-"が英文における単語の改行時のつなぎ文字であることから、自動的に"-"があるところで改行表示される設定になっているからだと思うのですが、 これをあえて、列幅どおりに 123456-789 abcdefg と表示させるようにすることはできないものでしょうか。 ALT+ENTERを使えばできるのですが、このようなデータを大量に入力し、かつ、セル幅が定まっていない場合、セルごとに改行位置を修正していくのは避けたいので、ALT+ENTERは使わないで表示させる方法があれば教えてください。

  • 正規表現で改行に置換するとき

    英文で、一文ずつ改行させたいと考えています。 それで、ピリオド+スペースで改行するように、次のような置換を行いました。 「 \.\s 」→「 \.\n 」 その結果、 This is a pen. That is a pencil. ↓↓ This is a pen. That is a pencil. のような場合はOKです。 しかし、「i.e. (つまり)」「e.g.(例えば)」が文中にあると困ったことになります。 I'm John, i.e. the president of the US.  ↓↓ I'm John, i.e. the president of the US. 質問) 「i.e.」と「e.g.」を除いて置換することはできるでしょうか?

  • C言語

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

専門家に質問してみよう