文字列の途中からの部分を表示させる場合もあって、途中からの
位置というのをcahr**型の配列に記憶させることにしました。
ポインタとnewがよく分からないから、それに近いサンプルを
作って実験しているところです。
#include <iostream.h>
main()
{
char selected[][6] = {"full", "nomal", "short"};
char *buf;
char **p;
buf = new char[500];
strcpy(buf, ",東京都,千代田区,九段南");
p = new char*[3];
for(unsigned int i=0, j=0; i<strlen(buf); i++)
{
if(buf[i] == ',')p[j++] = &buf[i+1];
}
for(int i=0; i<3; i++)
{
cout << selected[i] << "-" << p[i] << endl;
}
delete [] buf;
delete [] p;
}
結果は
full-東京都,千代田区,九段南
nomal-千代田区,九段南
short-九段南
で、問題なさそうに見えるけど心配だから質問しました。
このソースに問題はないですか?
得に、
char **p;
と
p = new char*[3];
と
p[j++] = &buf[i+1];
と
delete [] buf;
が心配です。
No.3ベストアンサー
- 回答日時:
配列で処理する場合と、ポインタで処理する場合では後者の方がパフォーマンスが良いです。
ただ、最近のコンパイラは賢いので、配列でもポインタでもあまり差はないと言われています。
ポインタに関する理解が曖昧な場合、バグを組み込みやすいので配列を用いた方が無難です。
実験でGCCでコンパイルして10万回実行するのにかかった時間を計測し、それを5回行いその平均値を求めると
配列で処理した場合、58秒
ポインタで処理した場合、44秒
という結果になりました。
ご参考までに。
No.2
- 回答日時:
特に問題はないと思います。
敢えて突っ込ませて頂きますと、
for(unsigned int i=0, j=0; i<strlen(buf); i++)
がforの条件を評価する際に毎回strlen()が実行されるので無駄かと思います。
以下はコードの読みやすさを考えるとダメかもしれませんが、パフォーマンスを重視する場合のサンプルです。
int main(int argc, char *argv[])
{
const char *sec[3] = {"full", "normal", "short"};
char *buf = new char[500];
char **p = new char*[3];
strcpy(buf, "東京都,新宿区,西新宿");
int n = strlen(buf);
*p = buf;
for(unsigned int i = 0, j = 1; i < n; i++)
{
if(*(buf+i) == ',') *(p+(j++)) = (buf+i+1);
}
for(int i = 0; i < 3; i++)
{
cout << *(sec+i) << " - " << *(p+i) << endl;
}
delete[] p;
delete[] buf;
return 0;
}
yatokesaさんへの回答になりますが、
newで割り当てたメモリはdeleteで,new[]で割り当てたメモリはdelete[]で解放することになっています。
どちらでも解放できるかもしれませんが、これに従わなかった場合の動作は未定義です。
この回答への補足
ありがとうございます。パフォーマンス重視の方がいいです。
for()でstrlen()が毎回実行されるのは気がつきませんでした。
s2tさんが書いてくれたソースは、ポインタの配列表現が
別の表現で書いてあります。
(char *)型の文字列の場合、例えば左辺値なら、
buf[i] よりも *(buf+i)、
例えば右辺値なら、
&buf[i] よりも buf+i、
の方がいい。速いというこですか?
No.1
- 回答日時:
問題ないですよ。
きれいにできてると思います。#実を言えば、delete [] buf; の []の意味がよくわかってなかったりしますが...^^;)。
仕様的に「東京都」の前のカンマが気になりますが....。
#プログラムを作りやすくするために先頭にカンマを入れないといけないと言うのであれば、と言うことです。
ありがとうございます。問題なくて安心しました。
s2tさんが回答してくれたけど、東京都の前のコンマのことで
p[0]は&buf[0]だと分かっているから、そこは改良した方が
いいですねー。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# C言語のバイナリファイルに関する質問 8 2022/06/24 07:20
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
C言語のプログラムについてです
-
char*を初期化したいのですが
-
new charとnew char[N]の違いは?
-
CStringからchar*への型変換に...
-
入力された文字列の中の数字を...
-
小数点入りの文字列をfloat型に...
-
C言語にて構造体のメンバがNULL...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
文字列str内の全ての数字を...
-
文字列の途中から途中までを抽出
-
プログラムの中身の意味
-
wsprintf( ポインタ , "%d" , "...
-
szとlpszの違い
-
しつこい様ですが、再度ポイン...
-
警告 : 問題のあるポインタの変換
-
Vectorでヒープエラーが出る
-
char型にint型の数値を代入する。
-
char 文字列型 の表現範囲が-12...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
char*を初期化したいのですが
-
CStringからchar*への型変換に...
-
C言語にて構造体のメンバがNULL...
-
C言語のintとcharの違いってな...
-
小数点入りの文字列をfloat型に...
-
new charとnew char[N]の違いは?
-
const char* s1とただのchar s1...
-
DWORDとcharの変換
-
strcat関数を自作したいです
-
C++17で、unsigned char * 配列...
-
文字列内の数字削除
-
エクセルのMID関数は、C言語では?
-
char 文字列型 の表現範囲が-12...
-
char型にint型の数値を代入する。
-
C言語を用いた環境変数の作成/...
-
動的メモリの初期化方法について。
-
fstream型オブジェクトを関数の...
-
C言語のプログラムについてです
-
文字列の途中から途中までを抽出
-
C言語:小文字を大文字に変換す...
おすすめ情報