• ベストアンサー

C言語で文字列置き換え

をしたのですが 例 取得した値でC:\\programfile\\LOGがあり 文字列処理を行ってLOGをRESULTにかえ C:\\programfile\\RESULT としたいのですがうまくいきません。 strtokを使って、その後にstrcatで連結させようとしたのですが・・・。教えてください><

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

>C:\\programfileを表示させたいのですがうまくいきません。 #2のプログラムでは、 最後の「\」を見つけて、その次の文字を「'\0'」に置き換えています。 "C:\\programfile\\\0" にするというような意味合いです。 *(p+1)='\0'; でそれをやっています。 pが最後の「¥」の位置です。 これを取り除くなら *p='\0'; とします。

その他の回答 (5)

回答No.5

No.2の補足に対する回答 No.2さんのプログラムは、「\\LOG」を切り取っているのではなく、「LOG」を切り取っているのです。 だから、途中経過の表示は C:\programfile\ になって当然です。この表示で正しいです。 この末尾に"RESULT"を連結すればOKですよ。 なお記述上は"\\"ですけれども、メモリ上では"\"になっていることを再認識してください。 一文字目の\はエスケープシーケンスを表す記号で、二文字目の\がホンモノです。 "\n","\t","\0"等を思い出してください。これらは「二つで一文字」です。

回答No.4

まず、"LOG"の位置を求めなさい。 求まった位置に'\0'を上かぶせで格納します。 こうして作った文字列"C:\\programfile\\"にstrcat()を用いて"RESULT"文字列を連結します。 ただし、元の文字列"C:\\programfile\\LOG"より三文字長くなりますから、事前にじゅうぶんな長さのストレージへ移しておいてから処理にとりかかりましょう。

  • coredump
  • ベストアンサー率46% (12/26)
回答No.3

僕は汎用の文字列置き換え関数を作って使っています。 ただ、バッファーオーバーフローはチェックしていない ので要注意です。 #include <stdio.h> // buffer overflowは無視している文字列置き換え関数 void replace(char *buf, char *pre, char *aft) {   char *p;   p = strstr(buf, pre);   if (p){     char *p_2 = p + strlen(pre);     replace(p_2, pre, aft);     memmove(p + strlen(aft), p_2, strlen(p_2)+1);     memcpy(p, aft, strlen(aft));   } } int main(void) {   char buf[1024] = "C:\\programfile\\LOG";   replace(buf, "LOG", "RESULT");   printf("%s\n", buf);   return 0; }

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

strtokを使って切り出しを行うよりも strrchrを使って最後の\の文字位置を見つけてそれを使って、やる方が簡単だと思います。 #include <stdio.h> #include <string.h> void main(void){ char path[256]="C:\\programfile\\LOG"; char *p; printf("before:%s\n",path); p=strrchr(path,'\\'); if(p!=NULL){ *(p+1)='\0';/* pathに余裕がある場合 */ strcat(path,"RESULT"); } printf(" after:%s\n",path); }

gfgdhggddg
質問者

補足

おはようございます。 やり方を変えてC:\\programfile\\LOG の\\LOGを切り取って C:\\programfileを表示させたいのですがうまくいきません。 どうしてもC:\\programfile\と表示され'\'が最後残ってしまいます・・・。 アドバイスお願い致します。

  • shyun-k
  • ベストアンサー率50% (12/24)
回答No.1

strtokを使ってstrcatで連結させた結果を表示させてみると どこが失敗してるかすぐ分かると思いますよ。 \で区切ると仮定して(区切り文字が分からないので) char *cptoken; char ctpath[64]; // cpgetpathは"C:\\programfile\\LOG"文字列のポインタとします cptoken = strtok( cpgetpath, "\\" ); // cptokenは"C:" strcpy( ctpath, cptoken ); // "C:"を文字列コピー strcat( ctpath, "\\\\" ); // "\\"を連結 cptoken = strtok( NULL, "\\" ); // cptokenは"programfile" strcat( ctpath, cptoken ); // "programfile"を連結 strcat( ctpath, "\\\\RESULT" ); // "\\RESULT"を連結 これでうまくいくと思います。 該当部分のコードだけですからあとは自分で補完して下さいね。