はじめてお世話になります。
超初心者でいまひとつ文字列について理解できていません。。
質問なのですが、
char str[/url]="comment\ncomment1";
と定義したものについて、
改行コード”\n”を”{\n}”に置き換えたいのです。
strtokとstrcatを使って出来る方法を思いついたのですが、
いまいち動きがよくわかりません。
どなたかご教授お願いします。
またもっと良い方法などあればそれも宜しくお願いします。
文字列置き換え
Re:文字列置き換え
strtokで分割するところまではできましたか?
「comment」と「comment1」という文字列に分解したら、
「comment」と「comment1」という文字列に分解したら、
char str2[64]; strcpy(str2, 一つ目の文字列); strcat(str2, "{\\n}"); //\記号を出力するには\\とします。 strcat(str2, 二つ目の文字列);こんな感じでできますよ。
Re:文字列置き換え
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;
何個改行コードがあるかわからないときに、↓のように
するとうまくいったようです。。
ネットで検索してでてきた通りに書いたのですが、
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:文字列置き換え
2個目以降NULLを渡さなければならないのは、strtok関数の仕様です。
この関数はちょっと癖のある関数なので、他の関数とは雰囲気が違いますね。
コードについてですが、2個目以降
「文字列を連結してから改行文字を付け足す」
を
「改行文字を付け足してから文字列を連結」
にしてみたらどうでしょう。1個目の連結処理のところも改行をくっつけないようにします。
この関数はちょっと癖のある関数なので、他の関数とは雰囲気が違いますね。
コードについてですが、2個目以降
「文字列を連結してから改行文字を付け足す」
を
「改行文字を付け足してから文字列を連結」
にしてみたらどうでしょう。1個目の連結処理のところも改行をくっつけないようにします。
Re:文字列置き換え
ちょっと気になったのですが、"strtok"を使うと、
文頭や文末、連続した'\n'が省略されてしまいますけど、いいのでしょうか。
文頭や文末、連続した'\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; }