ページ 11

文字列置き換え

Posted: 2009年2月26日(木) 11:50
by はる
はじめてお世話になります。
超初心者でいまひとつ文字列について理解できていません。。
質問なのですが、
char str[/url]="comment\ncomment1";
と定義したものについて、
改行コード”\n”を”{\n}”に置き換えたいのです。
strtokとstrcatを使って出来る方法を思いついたのですが、
いまいち動きがよくわかりません。
どなたかご教授お願いします。
またもっと良い方法などあればそれも宜しくお願いします。

Re:文字列置き換え

Posted: 2009年2月26日(木) 13:36
by SCI
strtokで分割するところまではできましたか?
「comment」と「comment1」という文字列に分解したら、
char str2[64];
    strcpy(str2, 一つ目の文字列);
    strcat(str2, "{\\n}"); //\記号を出力するには\\とします。
    strcat(str2, 二つ目の文字列);
こんな感じでできますよ。

Re:文字列置き換え

Posted: 2009年2月26日(木) 14:21
by はる
SCIさんありがとうございます。

何個改行コードがあるかわからないときに、↓のように
するとうまくいったようです。。
ネットで検索してでてきた通りに書いたのですが、
2個目以降の処理でstrtokにNULLを渡しているのがよくわかりません。

また最後にも"{\n}"がついてでます。
これを消したいのですが、
方法がわかりません。。

char *tp;
char buf_ato[100];
char str[/url]="comment\ncomment1";


//1個目
tp = strtok(str, "\n");
strcpy(buf_ato, tp);
if ( tp != NULL ){
strcat(buf_ato, "{\n}");
}
//2個目以降
while ( tp != NULL ){
tp = strtok(NULL, "\n");
if ( tp != NULL ){
strcat(buf_ato, tp);
strcat(buf_ato, "{\n}");
//} else {
//最後の"{\n}"を削除

}
}
printf("*** ato =%s\n",buf_ato);
return 0;

Re:文字列置き換え

Posted: 2009年2月26日(木) 14:35
by SCI
2個目以降NULLを渡さなければならないのは、strtok関数の仕様です。
この関数はちょっと癖のある関数なので、他の関数とは雰囲気が違いますね。

コードについてですが、2個目以降
「文字列を連結してから改行文字を付け足す」

「改行文字を付け足してから文字列を連結」
にしてみたらどうでしょう。1個目の連結処理のところも改行をくっつけないようにします。

Re:文字列置き換え

Posted: 2009年2月26日(木) 14:51
by はる
SCIさん何度もありがとうございます!!
まさにそれでできました!
本当に助かりました。

Re:文字列置き換え

Posted: 2009年2月26日(木) 14:52
by はる
ありがとうございました。

Re:文字列置き換え

Posted: 2009年2月26日(木) 19:29
by フリオ
 ちょっと気になったのですが、"strtok"を使うと、
文頭や文末、連続した'\n'が省略されてしまいますけど、いいのでしょうか。
#include <stdio.h>
#include <string.h>

void func(char *s1, const char *s2)
{
	while(*s1 = *s2){
		if(*s2 == '\n'){
			strcpy(s1, "{\\n}");
			s1 += strlen(s1);
		}
		else ++ s1;
		++ s2;
	}
}

void func2(char *buf_ato, char *str)
{
	char *tp; 
	
	tp = strtok(str, "\n"); 
	strcpy(buf_ato, tp); 
	while ( tp != NULL ){ 
		tp = strtok(NULL, "\n"); 
		if ( tp != NULL ){ 
			strcat(buf_ato, "{\\n}"); 
			strcat(buf_ato, tp); 
		} 
	} 
}

int main(void)
{
	char s1[128], s2[/url] = "\n\ncomment\n\n\ncomment1\ncomment2\n\n\n\n";
	
	func(s1, s2);
	puts(s1);
	func2(s1, s2);
	puts(s1);
	return 0;
}