No.1
- 回答日時:
そもそも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
というのが理解できませんでした。
難しいです。
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 ***
No.2
- 回答日時:
文字列を取り扱う際は文字型の配列または文字型への
ポインタを使用します。
つまり、
char array[256];
や
char *buffer;
buffer=(char*)malloc(sizeof(char)*256);
のように文字列の代入先のメモリ領域を
あらかじめ確保しておく必要があります。
Windowsはメモリ管理がかないいかげんなので
メモリ確保していない変数にも正常に代入できてしまいます。
また、日本語は1文字で2Byte消費しますので
上記の例の場合、127文字までしか使用できません。
cockyさんのサンプルでy[6]="\0";となってますが、
これはy[6]='\0';の記述ミスですね。
No.3
- 回答日時:
回答です。
#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] を表示してます。
※これは、あくまでも上記質問のケースの場合に限った
回答サンプルで、他の方の回答のような実用的なものではありません。
No.4
- 回答日時:
むつかしいところですね。
実は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;
}
2つのソースはどっちとも
for (int i=w_byte; ~
という行で
警告 W8012 test.cpp 10: 符号付き値と符号なし値の比較(関数 main() )
という警告が表示されたけど、3文字の抜き出しに成功しました。
とても難しいソースなので、もう少ししてからでないと
理解できそうにないけど、高級そうなソースなのでうれしいです。
ありがとうございます。
No.5
- 回答日時:
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] と同じことだ
というふうに記憶しました。
ありがとうございます。
No.6ベストアンサー
- 回答日時:
>とても難しいソースなので、もう少ししてからでないと
そうですね。前回のソースは汎用的なソースですね。
何文字入力しようとも(たとえ1万文字でも問題ありません)、「始めの文字」と「最後の文字」を削除するというプログラムです。
汎用性を消して、今回の目的により絞るのであれば、以下のようにするのが常套手段であり、一番スマートでしょう。
C++プログラマなら、ほとんど次のソースで見解が一致するはずです。
#include <string>
#include <iostream>
using namespace std;
void main() {
string s;
cin >> s;
cout << s.substr(2,6); // 「2byte目」から「6byte分」の長さを表示
}
この回答への補足
便利な関数を教えてもらいました。
ありがとうございます。
すぐに理解できました。
特別な関数を使う時に、#include 以外のものを宣言する
というのは初めて見ました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語にて構造体のメンバがNULL...
-
C言語のintとcharの違いってな...
-
WM_CHAR or WM_KEYDOWN の「wPa...
-
WritePrivateProfileString
-
文字列のswap
-
char*を初期化したいのですが
-
char AA[]{"全角文字"};から"全...
-
char 文字列型 の表現範囲が-12...
-
fstream型オブジェクトを関数の...
-
動的メモリの初期化方法について。
-
ポインタで詰まりました;
-
CStringからchar*への型変換に...
-
Run-Timeエラーの原因に関して...
-
C言語を用いた環境変数の作成/...
-
csvファイルを構造体に格納した...
-
[C] 構造体メンバーのカンマ区...
-
ポインタを使用 [数字列を数値...
-
const char* s1とただのchar s1...
-
fgetc( )の戻り値はなぜ整数??
-
std::stringクラスのc_str()で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
strcat関数を自作したいです
-
fstream型オブジェクトを関数の...
-
new charとnew char[N]の違いは?
-
DWORDとcharの変換
-
文字列の途中から途中までを抽出
-
char 文字列型 の表現範囲が-12...
-
const char* s1とただのchar s1...
-
wsprintf( ポインタ , "%d" , "...
-
c言語でポインタ変数を用いた配...
-
char型にint型の数値を代入する。
-
C言語で文字列をかえす正しい書...
-
C++17で、unsigned char * 配列...
-
共用体について
-
エクセルのMID関数は、C言語では?
おすすめ情報