-PR-
解決済み

文字列の処理

  • 暇なときにでも
  • 質問No.52809
  • 閲覧数106
  • ありがとう数7
  • 気になる数0
  • 回答数6
  • コメント数0

お礼率 59% (194/328)

#include <iostream.h>
main(){

char x[1]; //ここで あいうえお という5文字を入力
cin >>x;

}

↑いうえ という文字を cout << で表示するにはどうしたらいいんですか?
通報する
  • 回答数6
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.6
レベル11

ベストアンサー率 61% (157/255)

>とても難しいソースなので、もう少ししてからでないと
そうですね。前回のソースは汎用的なソースですね。
何文字入力しようとも(たとえ1万文字でも問題ありません)、「始めの文字」と「最後の文字」を削除するというプログラムです。

汎用性を消して、今回の目的により絞るのであれば、以下のようにするのが常套手段であり、一番スマートでしょう。
C++プログラマなら、ほとんど次のソースで見解が一致するはずです。

#include <string>
#include <iostream>
using namespace std;

void main() {
string s;
cin >> s;
cout << s.substr(2,6); // 「2byte目」から「6byte分」の長さを表示
}
補足コメント
A__

お礼率 59% (194/328)

便利な関数を教えてもらいました。
ありがとうございます。
すぐに理解できました。
特別な関数を使う時に、#include 以外のものを宣言する
というのは初めて見ました。
投稿日時 - 2001-03-21 00:46:20
関連するQ&A
-PR-
-PR-

その他の回答 (全5件)

  • 回答No.2
レベル12

ベストアンサー率 41% (324/772)

文字列を取り扱う際は文字型の配列または文字型への ポインタを使用します。 つまり、 char array[256]; や char *buffer; buffer=(char*)malloc(sizeof(char)*256); のように文字列の代入先のメモリ領域を あらかじめ確保しておく必要があります。 Windowsはメモリ管理がかないいかげんなので メモリ確保していない変数にも正 ...続きを読む
文字列を取り扱う際は文字型の配列または文字型への
ポインタを使用します。
つまり、
char array[256];

char *buffer;
buffer=(char*)malloc(sizeof(char)*256);
のように文字列の代入先のメモリ領域を
あらかじめ確保しておく必要があります。
Windowsはメモリ管理がかないいかげんなので
メモリ確保していない変数にも正常に代入できてしまいます。

また、日本語は1文字で2Byte消費しますので
上記の例の場合、127文字までしか使用できません。

cockyさんのサンプルでy[6]="\0";となってますが、
これはy[6]='\0';の記述ミスですね。
お礼コメント
A__

お礼率 59% (194/328)

グッドアドバイス。
投稿日時 - 2001-03-18 00:56:23


  • 回答No.1
レベル12

ベストアンサー率 57% (232/402)

そもそもchar x[1]だと、配列が短すぎてまともに動かないと思いますが。 ま、それはさておき、配列が十分な長さがあるとして考えると、ひらがな文字は2Byteコードなので、 #include <string.h> #include <iostream.h> main() { char x[256], y[256]; cin >> x; str ...続きを読む
そもそもchar x[1]だと、配列が短すぎてまともに動かないと思いますが。

ま、それはさておき、配列が十分な長さがあるとして考えると、ひらがな文字は2Byteコードなので、

#include <string.h>
#include <iostream.h>

main() {
char x[256], y[256];
cin >> x;
strncpy( y, x+2, 6 );
y[6] = "\0";
cout << y;
}

とでもすれば大丈夫では?
#ホントはmallocとか使って、メモリに無駄がないように処理した方がいいんでしょうけど。
補足コメント
A__

お礼率 59% (194/328)

selenityさんの情報にあったように
y[6] = '\0';
に直したらできました。
ありがとうございます。
簡単なソースだけど
strncpy( y, x+2, 6 ); の x+2
というのが理解できませんでした。
難しいです。
投稿日時 - 2001-03-18 00:55:33
お礼コメント
A__

お礼率 59% (194/328)

char x[1] だと、配列が短か過ぎでエラーになるかと
思っていたら、エラーにならない場合もあるから、
最低限の char x[1] にしたんです。
char の値を大きくとれば安心だけど、大きく取り過ぎて
使われない部分があるともったいないなーと思ってい
たりするんです。

ソースありがとうございます。
でも、bcc5.5でコンパイルエラーでした。

#include <string.h>
#include <iostream.h>

main() {
char x[256], y[256];
cin >> x;
strncpy( y, x+2, 6 );
y[6] = "\0";
cout << y;
}

エラー E2034 test.cpp 8: 'char *' 型は 'char' 型に変換できない(関数 main() )
*** 1 errors in Compile ***
投稿日時 - 2001-03-18 00:51:29
  • 回答No.3
レベル6

ベストアンサー率 27% (3/11)

回答です。 #include <iostream.h> main(){ char x[11]; //ここで あいうえお という5文字を入力 cin >>x; for(int i=2;i<8;i++){ cout << x[i]; } } ただしこれは 日本語5文字を入れる為に最低必要なメモリしか用意してま ...続きを読む
回答です。

#include <iostream.h>
main(){

char x[11]; //ここで あいうえお という5文字を入力
cin >>x;

for(int i=2;i<8;i++){
cout << x[i];
}
}

ただしこれは
日本語5文字を入れる為に最低必要なメモリしか用意してません。(x[11] → 5文字 × 2バイト + NULL = 11)
for文で x[2]~x[7] を表示してます。

※これは、あくまでも上記質問のケースの場合に限った
回答サンプルで、他の方の回答のような実用的なものではありません。
お礼コメント
A__

お礼率 59% (194/328)

bcc5.5でできました。
ありがとうございます。
こういう方法もあるということが勉強になりました。
投稿日時 - 2001-03-18 01:06:49
  • 回答No.4
レベル11

ベストアンサー率 61% (157/255)

むつかしいところですね。 実はC/C++はこんな簡単なことも統一的な答えが出ないようなヘロイ言語です。 システム記述とか、何万行もの大掛かりなプログラムには向いていますが、個人使用で、文字列処理を中心とするアプリを組むならPerl言語などの方がよほどか将来のためかも。。。 といってもまぁ、人を魅了するような魅力ある言語ではありますが。。。(私も大好きですし♪) さて、ご質問のないようですが。。 ...続きを読む
むつかしいところですね。
実はC/C++はこんな簡単なことも統一的な答えが出ないようなヘロイ言語です。
システム記述とか、何万行もの大掛かりなプログラムには向いていますが、個人使用で、文字列処理を中心とするアプリを組むならPerl言語などの方がよほどか将来のためかも。。。
といってもまぁ、人を魅了するような魅力ある言語ではありますが。。。(私も大好きですし♪)

さて、ご質問のないようですが。。。

#include <string>
#include <iostream>
using namespace std;

int main(void) {
string s;
cin >> s;
int w_byte=sizeof(wchar_t); // 日本語の一文字の大きさ
for (int i=w_byte; i<s.size()-w_byte; i++) {
cout << s[i];
}
return 0;
}


という妥協案ぐらいになるのではないでしょうか?
wstring型がちゃんとstring型とどうレベルでiostreamに対応していれば、3行程度で汎用的に書けるのですが、たぶんそんな完成度の高いコンパイラはGNU、VC++系、BC++系含め、ほとんどないと思いますので、上記のものとなります。


(bcc系を使用なされておられるようなので、「少し古い系」も紹介しておきます)
#include <cstring.h>
#include <iostream.h>

int main(void) {
string s;
cin >> s;
int w_byte=sizeof(wchar_t); // 日本語の一文字の大きさ
for (int i=w_byte; i<s.length()-w_byte; i++) {
cout << s[i];
}
return 0;
}
お礼コメント
A__

お礼率 59% (194/328)

2つのソースはどっちとも
for (int i=w_byte; ~
という行で
警告 W8012 test.cpp 10: 符号付き値と符号なし値の比較(関数 main() )
という警告が表示されたけど、3文字の抜き出しに成功しました。
とても難しいソースなので、もう少ししてからでないと
理解できそうにないけど、高級そうなソースなのでうれしいです。
ありがとうございます。
投稿日時 - 2001-03-18 01:17:47
  • 回答No.5
レベル6

ベストアンサー率 27% (3/11)

cockyさんの補足について まず、ポインタを理解する必要があります。 strncpy( y, x+2, 6 ); 引数がポインタなので、x[2] を指しています。 つまり、strncpy( y, x, 6 ); の場合 x は、 x[0] を示しています。 ↓の様に書くことも出来ます。意味は同じです。 strncpy( y, &x[2], 6 ); こ ...続きを読む
cockyさんの補足について
まず、ポインタを理解する必要があります。

strncpy( y, x+2, 6 );

引数がポインタなので、x[2] を指しています。

つまり、strncpy( y, x, 6 ); の場合 x は、

x[0] を示しています。

↓の様に書くことも出来ます。意味は同じです。

strncpy( y, &x[2], 6 );

これでわかりますか?
補足コメント
A__

お礼率 59% (194/328)

ポインタのことが分かってないんです。

*p ポインタが指しているの (自身:あり)
p ポインタ自身の値 (自身:なし)
&p これがよく分かりません。

strncpy( y, x+2, 6 );
の x+2 が x[2] を指しているというのは今理解できました。
strncpy( y, &x[2], 6 );
という書き方もできるというのが分かりませんでした。
どちらかというと
strncpy( y, *x[2], 6 );
なんじゃないのかなー と思ってしまいます。
& という文字をあまり見ていないからかもしれません。

でもここで、x+2 というのは &x[2] と同じことだ
というふうに記憶しました。
ありがとうございます。
投稿日時 - 2001-03-19 02:13:44
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ