ページ 1 / 1
文字列の中から改行コードを検索
Posted: 2009年3月17日(火) 16:43
by ざく
はじめまして。C初心者です。
どなたかご教授お願いします。
タイトルどおりなのですが、
元々、文字列の中から改行コードを検索して、別の文字列{\n}に置き換えるプログラム
だったのですが、
メモリを破壊していました。
以下そのプログラムです。
(pqgetvalueでテーブルの値を取得しています)
char hensyu[100];
char *tp;
tp = strtok(PQgetvalue(*res,0,5), "\n");
strcpy(hensyu, tp);
while ( tp != NULL ){
tp = strtok(NULL, "\n");
if ( tp != NULL ){
strcat(hensyu, "{\\n}");
strcat(hensyu, tp);
}
}
hensyuエリアがたりなかったようです。。
なので、改行コードの個数を数えて、mallocで正しくhensyuエリアを取ろうとおもったのですが、
どうやって数えたらいいのかわかりません。。
strtokを2回やるのも不毛なかんじがしますし。
どなたかよろしくおねがいします。
Re:文字列の中から改行コードを検索
Posted: 2009年3月17日(火) 16:49
by SCI
strlen関数で文字列の長さを調べてみてはどうでしょう。strlen(tp)です。
2回になってしまうのはある意味strtokの癖なんですが、ループ1つにまとめる場合、
p = PQgetvalue(...);
while ((tp = strtok(p, "\n")) != NULL)
{
/* ... */
p = NULL;
}
などの方法がありますね。
Re:文字列の中から改行コードを検索
Posted: 2009年3月17日(火) 17:02
by ざく
> SCI さん
返信ありがとうございます。
strlen(tp)でわかるんですか???初心者ですみません。
mallocの方法が
hensyu = (char *)malloc(sizeof(char)*PQgetvalue(*res,0,5));
このやり方しかしらなくて、
sizeofでとってきてさらに、改行コードの数×4(「{\n}」で4バイトだから。。)
を足さないと・・・・と思ってしまって。。
Re:文字列の中から改行コードを検索
Posted: 2009年3月17日(火) 17:13
by SCI
例えば、こんな感じです。
#include <stdio.h>
int main(void)
{
char *p = "Sample\n\nText\nMoeMoe";
char *tp;
char *buf;
while ((tp = strtok(p, "\n")) != NULL)
{
buf = (char *)malloc(strlen(tp) + 1);
strcpy(buf, tp);
printf("%s\n", buf);
free(buf);
p = NULL;
}
return 0;
}
「strlen() + 1」としているのは、最後の'\0'のためです。
また、strtokだと改行の個数は無視されます。
Re:文字列の中から改行コードを検索
Posted: 2009年3月18日(水) 08:25
by ざく
>SCIさん
何度もすみません。。
実際に教えていただいたコードを
動かしてみたのですが、
segmentation faultになってしまいました。
gdbでデバックしてみましたが、strtokのあたりがおかしいとのことらしいです。。
strtokの使い方あっているようにみえるのですが。。
Re:文字列の中から改行コードを検索
Posted: 2009年3月18日(水) 09:04
by fatens
strtokで文字列を変更してしまうため、配列にする必要があります。
そして、表示するだけならメモリの確保は必要なく、このようにできると思います。
#include <stdio.h>
#include <string.h>
int main(void)
{
char p[/url] = "Sample\n\nText\nMoeMoe";
char *tp;
tp = strtok(p, "\n");
while (tp != NULL) {
printf("%s\n", tp);
tp = strtok(NULL, "\n");
}
return 0;
}
Re:文字列の中から改行コードを検索
Posted: 2009年3月18日(水) 09:10
by Blue
strtokの第一引数は変更可能のchar*を渡さないといけないので、
>char *p = "Sample\n\nText\nMoeMoe";
は変更すべき領域でないのでエラーになってしまうのでしょう。
char s[/url] = "Sample\n\nText\nMoeMoe";
char* p = s;
では大丈夫だと思います。
>buf = (char *)malloc(strlen(tp) + 1);
>strcpy(buf, tp);
strdup関数を使うと便利だと思います。
Re:文字列の中から改行コードを検索
Posted: 2009年3月18日(水) 09:24
by ざく
>Blueさん
ありがとうございます。
ちゃんと動きました。
ただ・・・・、
このコードをうごかすと
結果が、
Sample
Text
MoeMoe
になります。そうなるのはわかるんですが、
"Sample\n\nText\nMoeMoe"
という文字列を、
"Sample{\n}{\n}Text{\n}MoeMoe"
と編集したいのです。。
で、かつ文字列の長さはわからない&改行コードも何個あるかわからない
だったので、mallocで編集後のメモリを確保したかったのです。。。
Re:文字列の中から改行コードを検索
Posted: 2009年3月18日(水) 09:55
by Blue
確認ですが、開発環境は何でしょうか?
それと、SQLで取得した結果を使うのであればもとからreplaceして取得するのではだめなのでしょうか?
select replace(カラム名1, '\n', '{\\n}'), カラム名2, ・・・
from テーブル名
Re:文字列の中から改行コードを検索
Posted: 2009年3月18日(水) 10:14
by ざく
>Blueさん
!!selectにreplace機能があるんですね!
知りませんでした。
開発環境はsolaris8です。
postgresqlは8.0.2です。
Re:文字列の中から改行コードを検索
Posted: 2009年3月18日(水) 12:15
by SCI
fatensさん、Blueさん
ソースの訂正ありがとうございます(汗
ざくさん
必要ないかもしれませんが、改行個数(というか改行部分の置き換え)をC言語でやるなら、一文字ずつ見ていくのが簡単かもしれません。
確か、文字列の検索はできても置換はバッファの関係でどうしても一手間必要になると思うので・・・
最初から大きめの領域をとっておくという妥協案はありますね。
ちょっと効率のいい方法が思いつかないです、お役に立てなくてごめんなさい(´・ω・)
Re:文字列の中から改行コードを検索
Posted: 2009年3月18日(水) 12:32
by ざく
>SCIさん
いえいえとんでもないです。とても勉強になりました。
今select replaceでやってみているのですが、
あと少しでうまくいきそうな?かんじです。
それでもだめならどかんと大きい領域をとってしまってから、
最初の方法で対応しようと思います。
本当にありがとうございます。