失礼します。
現在配列に格納された文字列から同じ文字列があった場合削除するという処理をしたいのですが上手くいきません
mallocは要素数をカウントできないと聞きどのようにすべての配列から比較すればいいのかわかりません
strs[0]にaaa strs[1]にbbbと以降も要素が入っているとして
例 処理前 aaa,bbb,ccc,ddd,ccc
この配列のそれぞれを比べて
処理後 aaa,bbb,ccc,ddd
このようにしていきたいです。
何かサンプルコードなどがあればいただきたいです。
今現在こちらのstrsに要素が入っています。
説明の仕方が下手だと思いますが何卒宜しくお願い致します。
配列 文字列 重複 削除
Re: 配列 文字列 重複 削除
まず、配列に文字列を格納するコードは書けますか?tarou さんが書きました:現在配列に格納された文字列から同じ文字列があった場合削除するという処理をしたいのですが上手くいきません
書ける場合、それを提示していただけるとそれをベースにして目標の処理を書きやすいので、提示していただきたいです。
適当な変数に要素数を保存しておき、それを用いてループなどで処理すればいいでしょう。tarou さんが書きました:mallocは要素数をカウントできないと聞きどのようにすべての配列から比較すればいいのかわかりません
tarou さんが書きました:今現在こちらのstrsに要素が入っています。
この確保の仕方は良くないですね。
先頭要素へのポインタがchar**で示される配列の要素はchar*であり、charではありません。
また、sizeof(char)は1と定義されているので、要素の型とも関係ないのに掛ける意味は無いでしょう。
オフトピック
ヘッダをインクルードせずにmalloc関数を使いたいが、ヘッダをインクルードしないのでsize_tと書くとエラーになる。
そこで、sizeof(char)を用いてsize_t型の値を作る。
…みたいな特殊な用途なら掛ける意味はあるかもしれません。
そこで、sizeof(char)を用いてsize_t型の値を作る。
…みたいな特殊な用途なら掛ける意味はあるかもしれません。
C言語なら、mallocの戻り値のキャストは不要であり、するべきではないので C++なら、そもそもmallocなんか使わずに とするといいでしょう。
もしくは、C++ならstd::vectorとstd::stringを利用するほうがいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 配列 文字列 重複 削除
>>配列に文字列を格納するコードは書けますか?
書ける場合、それを提示していただけるとそれをベースにして目標の処理を書きやすいので、提示していただきたいです。
えと、例みたいなものですか?
これでいいかわかりませんが、、、、
今試しに作成してみました。
>>今現在こちらのstrsに要素が入っています。
こういった形でしょうか?
これを別のfor文の中で
と、key_buf2に格納されている文字列をstrsに格納していっています。
書ける場合、それを提示していただけるとそれをベースにして目標の処理を書きやすいので、提示していただきたいです。
えと、例みたいなものですか?
これでいいかわかりませんが、、、、
今試しに作成してみました。
char *strings[] = { "ABC", "DEF", "GHI" };
printf("%s\n", strings[0]);
printf("%s\n", strings[2]);
こういった形でしょうか?
これを別のfor文の中で
と、key_buf2に格納されている文字列をstrsに格納していっています。
Re: 配列 文字列 重複 削除
key_buf2にmallocで確保したバッファのポインタが入っていると仮定すると、こんな感じでしょうか?
計算量は文字列の数をN、文字列の長さをMとしてO(MN^2)です。
計算量は文字列の数をN、文字列の長さをMとしてO(MN^2)です。
int new_text_count = 0; /* 重複削除後の文字列の数 */
int i, j;
for (i = 0; i < text_count; i++) {
int is_new = 1;
for (j = 0; j < new_text_count; j++) {
if (strcmp(strs[i], strs[j]) == 0) {
/* 既に同じ文字列がある */
is_new = 0;
break;
}
}
if (is_new) {
/* 同じ文字列が無かったので、結果データに加える */
strs[new_text_count] = strs[i];
++new_text_count;
} else {
/* 同じ文字列があったので、消す */
free(strs[i]);
}
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 配列 文字列 重複 削除
自分は、大いに意味があると思います。間違いなく1個1バイトの領域を必要な個数だけ動的確保している、ということを示す、という点において。みけCAT さんが書きました: また、sizeof(char)は1と定義されているので、要素の型とも関係ないのに掛ける意味は無いでしょう。
こういう書き方をごく普通にしてました。以前Cでシステムを開発してたとき。
ま、宗教論争になりそうなのであまり深入りするのはやめときましょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 配列 文字列 重複 削除
1個1バイトのオブジェクトの配列を確保する場面においては、たしかに可読性の面でいいでしょう。box さんが書きました:自分は、大いに意味があると思います。間違いなく1個1バイトの領域を必要な個数だけ動的確保している、ということを示す、という点において。みけCAT さんが書きました: また、sizeof(char)は1と定義されているので、要素の型とも関係ないのに掛ける意味は無いでしょう。
ただし、char型の配列の場合はsizeof(char)、unsigned char型の配列の場合はsizeof(unsigned char)のように、
「1個1バイトの領域を確保している」ことを示すより、確保したい配列の要素の型を具体的に示したほうが読みやすい気がします。
また、今回の場合はポインタの配列の確保であり、ポインタは多くの環境では1バイトではないので、
逆にcharの配列を確保しているという誤解を与えて有害であるように思えます。
のような書き方もしていましたか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)