• ベストアンサー

行ごとに文を単語単位で逆順に出力するプログラム

input.txtを読み込み、各行を単語単位で逆順にしてoutput.txtに出力するプログラムを考えています。 例えば、input.txtの内容が Hello World. I study java. Please help me. である場合、output.txtの内容は .World Hello .java study I .me help Please となります。 この問題に対し、私は http://shorttext.com/pg8p6enbnd にあるようなプログラムを考えました。 しかし、実際に実行してみると、上の例でいうなら World. Hello java. study I World. Hello me. help Please java. study I World. Hello のように出力されてしまいます。 どこがおかしいのでしょうか?どなたか教えてください。

  • Java
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.2

問題点は2つ。 1番目は、No1さんの指摘の通り。tokenList がどんどん長くなっていくので、 A B C D E の入力だと1行目の処理では、tokenList=["A","B","C"]で、出力が "C B A"になりますが、2行目の処理では出力を"E D“にしたいのに、tokenList=["A","B","C","D","E"]になり、出力が"E D C B A"になってしまいます。行ごとにclearが必要。 2番目は、StringTokenizer は区切り文字を与えないと、空白文字で語を区切るので、ピリオドは語の一部になります。 変更を最小限にするとループの中はこんな感じで。 StringTokenizer st = new StringTokenizer(line," .",true); tokenList.clear(); while (st.hasMoreTokens()) { String token = st.nextToken(); tokenList.add(token); } String reverse = ""; for (int i = 0; i < tokenList.size(); i++) { reverse = reverse + tokenList.get(tokenList.size()-i-1); }

tksmsysh
質問者

お礼

ご回答ありがとうございます! StringTokenizerのコンストラクタの第2引数で区切り文字を決められるんですね。しかも複数与えられるようなので勉強になりました! 今回は2つの問題点に言及して下さり、具体的なプログラムを示してくださったnotnotさんにベストアンサーを贈らせていただきたいと思います。

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

tokenList の中身をクリアする処理がループの中で行われていません。従って、前に逆転させた行がtokenList の中に残っていて、次の逆転させた文字列の表示処理で前のものが表示されてしまいます。  while ((line = in.readLine()) != null) { の直後に   tokenList.clear(); を挿入すればあなたが考えたとおりの動きになると思います。

tksmsysh
質問者

お礼

ご回答ありがとうございます! なるほど、確かにtokenListには単語が蓄積されていくばかりですね(^_^;) tokenList.clear()便利ですね!

関連するQ&A

  • 単語逆順コピープログラム

    入力された文字列を逆から表示するというプログラムを作成しているのですがなかなかうまくいきません。僕の作成したプログラムを載せておくので間違いの指摘をお願いします。 出力例(一部) 入力文字列:[ pen. a is This ] 出力文字列:[This is a pen.] ---------コードここから--------- #include <stdio.h> #include <string.h> /* マクロの定義 */ #define BUF 1024 int main(void){ char in[BUF]; /* 入力された文字列を保存する */ char out[BUF]; /* input の内容を単語逆順にして保存する */ int wordcount = 0; /* 単語数 */ char *in_ptr, *out_ptr; /* それぞれの文字列の文字を指すポインタ */ int wsp[128], wep[128]; /* 単語の先頭の添え字と単語末の添え字を保存する配列 */ int i, j; printf("入力された英単語列を単語逆順にします\n"); printf("入力:"); fgets(in, sizeof(in), stdin); sscanf(in, "%c", &in); /* \nを\0に書き換える */ in_ptr = in + strlen(in) - 1; *in_ptr = '\0'; /* 単語数カウント */ printf("文字数のカウント開始\n"); in_ptr = in; if(*in_ptr != ' '){ wordcount++; } for(in_ptr = in; *in_ptr != '\0'; in_ptr++){ if(*in_ptr != ' ' && *(in_ptr - 1) == ' '){ wordcount++; } } printf("文字数のカウント終了: %d単語\n", wordcount); printf("\n単語逆順処理開始\n"); for(i = 0; i < wordcount; i++){ for(in_ptr = in; *in_ptr != '\0'; in_ptr++){ if(*in_ptr != ' ' && *(in_ptr - 1) == ' '){ wsp[i] = *in_ptr; } if((*in_ptr - 1) != ' ' && (*in_ptr == ' ' || *in_ptr == '\0')){ wep[i] = *in_ptr; } } } out_ptr = out; for(i = wordcount - 1; i <= 0; i--){ for(*in_ptr = wsp[i]; *in_ptr <= wep[i]; in_ptr++){ *out_ptr = *in_ptr; out_ptr++; } } printf("単語逆順処理終了\n"); printf("\n入力文字列:[%s]\n", in); printf("出力文字列:[%s]", out); return 0; } ---------コードここまで---------

  • 指定の行をループさせてファイルに出力

    C言語で"input.txt"内の文の行範囲と 繰り返す回数をキーボードから入力することにより 結果を"output.txt"に出力するプログラムを考えているのですが、うまくできません。 具体例を以下に示しておきます。 ----input.txt---- aaaa bbbb cccc dddd eeee ------------------ キーボードから繰り返す範囲、2行目と4行目を指定。 繰り返す回数を2回に指定。 ----output.txt---- aaaa bbbb cccc dddd bbbb cccc dddd eeee ------------------- と、こんな感じにしたいです。 指定した行範囲を"output.txt"に出力することはできたのですが 繰り返しの部分がうまくできません。 どなたかご教授お願いします。 自分が作ったプログラムを下に載せておきます。 これをベースに作れたらいいのですが・・・ #include<stdio.h> #include<stdlib.h> #define STR_MAX 256 int main (void) { FILE *fpin, *fpout; char buff[STR_MAX]; int line = 1; int start; int end; printf("start >>"); scanf("%d",&start); printf("end >>"); scanf("%d",&end); if((fpin = fopen("input.txt","r")) == NULL) { printf("infile can't open\n"); exit(EXIT_FAILURE); } if((fpout = fopen("output.txt","w")) == NULL) { printf("outfile can't open\n"); exit(EXIT_FAILURE); } while(fgets(buff,STR_MAX,fpin) != NULL) { if((line >= start)&&(line <= end)) { fputs(buff,fpout); } line = line + 1; } fclose(fpout); fclose(fpin); return EXIT_SUCCESS; }

  • c++ 入力、出力まわりについて

    Mac OSX 10.7.3です。 c++で書いたプログラムをコンパイルして以下のような数字の集まりを上の行から順に入力したいです。 このプログラムはこの数字列の値により出力をするものとします。 3 3 6 100 2 64 main.cppというコードを使っていて上の数字を保存した input.txtというファイルがあり、output.txtという出力ようのファイルがDesktop下にあります。 ここでターミナルで cd Desktop/ g++ -Wall main.cpp ./a.out < input.txt > output.txt とリターンしてもうまくoutput.txtに出力されません。

  • javaの簡単なソースがコンパイル出来ません

    Javaを始めてみましたが、最も簡単なjavaのソースがどうしてもコンパイル出来ません。 どうしたらいいのか教えて下さい。 デスクトップの以下の Hello.java に対して、 public class Hello { public static void main(String[] args) { System.out.println("Hello,World"); } } 以下の3通りの方法でコンパイルを掛けてみると、 ‥デスクトップ>javac Hello.java javac:ファイルが見つかりません:Hello.java 使い方:javac <ptions> <source files> 使用可能なオプションのリストについては-helpを使用します >javac Hello.java.txt エラー:クラス名 ‘Hello.java.txt’が受け入れられるのは、注釈処理が明示的に要求された場合だけです エラー1個 >javac Hello エラー:クラス名 ‘Hello’が受け入れられるのは、注釈処理が明示的に要求された場合だけです エラー1個 でどの場合もコンパイルされません。 なお、javaのバージョンは “1.6.0_06”で、パスも C:\Program Files\Java\jdk1.6.0_06\bin\; と設定してあります。 どうしたらコンパイルが出来るのか、教えて下さい。

    • ベストアンサー
    • Java
  • I don't know.

    My computer cannot input Japanese. How do I input Japanese? Please rearlly help me.

  • フォルダーの深さの限界

    linux上のgccを用いて計算処理をさせるつもりです。 1.下記の動作はうまく行きました。(フォルダ名を一部伏字にしています)。 sprintf(input_file,"./w****/o*****/%d.txt",i); sprintf(output_file,"./testout/%d.txt",i); input_fileを入力し、計算処理し、output_fileに出力する。 計算しやすいようにファイル名は自然数を使います。 2. ただし、下記の動作はうまく行かないです。 sprintf(input_file,"./w****/o*****/live/%d.txt",i); sprintf(output_file,"./testout/%d.txt",i); PCの動作が中断します。 input_fileの階層が一段増えたせいなのかもしれません。 どなたか解決法を教えてください。

  • 簡単な入力出力のプログラムの間違いがわかりません

    こんにちは、さんたと申します。 よろしくお願い致します。 次のプログラムは、本に載っていたものを写したものです。何回も見直すのですが、エラーが出て止まってしまいます。もし、お分かりになられましたら、教えて下さいましたら幸いです。 よろしくお願い致します。 簡単な入力出力のプログラム(キーボードからの入力を読み込んで、画面に出力する) ********************************* c:\java_study>javac p2.java p2.java:7: ';' がありません。 While((line = in.readLine()) != null) { ^ エラー 1 個 ******************************* import java.io.*; public class p2 { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String line; While((line = in.readLine()) != null) { System.out.println(line); } } }

    • ベストアンサー
    • Java
  • grepやsed,shプログラムによるデータの整形

    grep や sed などのコマンドを使ってデータの整形をしたいと思っています。 具体的には、以下のように先頭の2字(A-Z)を「hello world」に置き換えて、 かつ全行に「 good bye」を追加したいです。 元のデータ(1.txt) を整形して 2.txt として出力し保存したいと思います。 どのようにコマンドを駆使すれば可能でしょうか。 コマンド一発でなくても shでさらさらっと書いて実現できれば それでも無問題ですので、サンプルプログラムをご提示頂けましたら大変嬉しいです。 アドバイス宜しく御願いいたします。 #元のデータ(1.txt) AA 111111.111/111 AC 22/2222222.2222 AA 33333/3333333 BB 44444.4444/444 AK 5/55555.5555 GB 66/666.666666 CC 77.7.777.77/777 #整形後のデータ (2.txt) hello world 111111.111/111 good bye hello world 22/2222222.2222 good bye hello world 33333/3333333 good bye hello world 44444.4444/444 good bye hello world 5/55555.5555 good bye hello world 66/666.666666 good bye hello world 77.7.777.77/777 good bye

  • Runtime.getRuntime().execの使い方

    Javaプログラムを実行するだけで、コマンドプロンプトを起動させ、 Mecabを動かしています。 try { String[] command = new String[8];  command[0] = "cmd.exe";  command[1] = "/c";  command[2] = "C:\\Program Files\\mecab\\bin\\mecab.exe";  command[3] = "-F";  command[4] = "\"%m,%f[0]\"";  command[5] = "result.txt";  command[6] = ">";  command[7] = "output.txt";  process = Runtime.getRuntime().exec(command);  以下省略 上のようにすると、output.txtにうまく出力してくれません。 ちなみに、  command[3] = "-F";  command[4] = "\"%m,%f[0]\""; の部分を省くとうまくoutput.txtに書き込まれます。 出力フォーマットを指定する方法はありますでしょうか。 またMecab単体を起動させて mecab -F "%m,%f[0]" result.txt > output.txt …(1) (1)のように入力するとうまくいきます。 Javaプログラムで(1)を実行させたいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • php5でjavacを含むシェルの実行ができない

    こんにちは。シェル、php5初心者です。 まずはそれぞれのソースを記します。 j.sh ~~~~~~~~~~~~~~~~~~~~~~ #!/bin/bash javac Hello.java java Hello ~~~~~~~~~~~~~~~~~~~~~~ Hello.java ~~~~~~~~~~~~~~~~~~~~~~ public class Hello { public static void main(String[] args) { System.out.println("Hello, World"); } } ~~~~~~~~~~~~~~~~~~~~~~ test.php ~~~~~~~~~~~~~~~~~~~~~~ <?php $output = shell_exec('./j.sh'); echo "<pre>$output</pre>"; ?> ~~~~~~~~~~~~~~~~~~~~~~ 以上のプログラムを使用しtest.phpを実行したときにshell_exec関数によってWebブラウザ上にHello,Worldと表示させたいのですが、コンパイルすらされていないみたいです。どうしたらよいでしょうか。 端末から./j.shのようにシェルを実行するとしっかりとHello,Worldと結果が返ってくるのですが。 ちなみにjavacを含まないシェル(ls -l,cpなど)はphpから実行できました。 どうかよろしくお願いします。 os vine linux 4.3

    • 締切済み
    • PHP

専門家に質問してみよう