文字列置き換え

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
はる

文字列置き換え

#1

投稿記事 by はる » 16年前

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

SCI

Re:文字列置き換え

#2

投稿記事 by SCI » 16年前

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

はる

Re:文字列置き換え

#3

投稿記事 by はる » 16年前

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;

SCI

Re:文字列置き換え

#4

投稿記事 by SCI » 16年前

2個目以降NULLを渡さなければならないのは、strtok関数の仕様です。
この関数はちょっと癖のある関数なので、他の関数とは雰囲気が違いますね。

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

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

はる

Re:文字列置き換え

#5

投稿記事 by はる » 16年前

SCIさん何度もありがとうございます!!
まさにそれでできました!
本当に助かりました。

はる

Re:文字列置き換え

#6

投稿記事 by はる » 16年前

ありがとうございました。

フリオ

Re:文字列置き換え

#7

投稿記事 by フリオ » 16年前

 ちょっと気になったのですが、"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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る