#include <iostream.h>
main(){

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

}

↑いうえ という文字を cout << で表示するにはどうしたらいいんですか?

このQ&Aに関連する最新のQ&A

A 回答 (6件)

>とても難しいソースなので、もう少ししてからでないと


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

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

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

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

この回答への補足

便利な関数を教えてもらいました。
ありがとうございます。
すぐに理解できました。
特別な関数を使う時に、#include 以外のものを宣言する
というのは初めて見ました。

補足日時:2001/03/21 00:46
    • good
    • 0

cockyさんの補足について


まず、ポインタを理解する必要があります。

strncpy( y, x+2, 6 );

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

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

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

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

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

これでわかりますか?

この回答への補足

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

*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
    • good
    • 0

むつかしいところですね。


実は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;
}
    • good
    • 0
この回答へのお礼

2つのソースはどっちとも
for (int i=w_byte; ~
という行で
警告 W8012 test.cpp 10: 符号付き値と符号なし値の比較(関数 main() )
という警告が表示されたけど、3文字の抜き出しに成功しました。
とても難しいソースなので、もう少ししてからでないと
理解できそうにないけど、高級そうなソースなのでうれしいです。
ありがとうございます。

お礼日時:2001/03/18 01:17

回答です。



#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] を表示してます。

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

bcc5.5でできました。
ありがとうございます。
こういう方法もあるということが勉強になりました。

お礼日時:2001/03/18 01:06

文字列を取り扱う際は文字型の配列または文字型への


ポインタを使用します。
つまり、
char array[256];

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

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

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

グッドアドバイス。

お礼日時:2001/03/18 00:56

そもそも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とか使って、メモリに無駄がないように処理した方がいいんでしょうけど。

この回答への補足

selenityさんの情報にあったように
y[6] = '\0';
に直したらできました。
ありがとうございます。
簡単なソースだけど
strncpy( y, x+2, 6 ); の x+2
というのが理解できませんでした。
難しいです。

補足日時:2001/03/18 00:55
    • good
    • 0
この回答へのお礼

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qstd::cout << p と std::cout << *p の違

std::cout << p と std::cout << *p の違いは?

VC++でコードを書きながらC++を学んでいます。
ポインタで疑問に思ったことがあるので質問させて下さい。

int* p;
int n = 100;
p = &a;

上記のように変数を宣言・代入した場合、
std::cout << p と std::cout << *p のどちらでも"100"と表示されます。
これら二つの違いは何でしょうか?
本来*pとすべきところをpにしてもVC++が気を利かせて
&pのアドレスに入っているデータを表示してくれているということでしょうか?

Aベストアンサー

No.1氏の回答にあるコードを元に答えます。

>この場合&pでもアドレスが表示されると思うのですが、
>「&p」と「p」の違いは何でしょうか?
pはaのアドレス。
&pはpのアドレス。
(「p = &a」では、どこのアドレスを渡しているのか考えてみて下さい)


「&p」と「p」の違いというのが参照とポインタの違いを聞いているのだとしたら、constのポインタ==参照型で良かったと思います。
p = &a; //OK
&a = p; //error
int* const p2 = p;
p2 = &a; //error

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

Qchar *str; と char* str;

char *str; と char* str;
どっちも同じことを意味しているんですか?

Aベストアンサー

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染むのでしょう。ちなみにそういう風な人たちは

char *str1, *str2;

とは、書けない体になっています。

char* str1;
char* str2;


変数の宣言だと、C に慣れていれば、char* str というのはちょっと違和感があるのは
私も分かりますが、関数のプロトタイプ宣言だと、どちらの方がすっきりしますか?

extern char *memcpy(char *, const char *);

extern char* memcpy(char*, const char*);


# まあ、どっちが正しい、っていうんじゃ無いんですよね

同じことを指している、というのは、先の回答の通りです。

また、ひとつの宣言で変数を複数宣言したときに、char* str という表記は間違い
易いじゃないか、ということが言われているのも事実です。実際、いろいろな C のソースを
見ていても、まずアスタリスクを型につけて書くのは、まずお目にかかれません。

ただ C++ では、char* str という宣言も良く使われています。

C++ に限らずオブジェクト指向の言語は、強く型を意識するので、「文字のポインタ型」と
いう意味で、まとめて書く方が馴染む...続きを読む

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む


人気Q&Aランキング

おすすめ情報