- ベストアンサー
C言語で文字列置き換え
をしたのですが 例 取得した値でC:\\programfile\\LOGがあり 文字列処理を行ってLOGをRESULTにかえ C:\\programfile\\RESULT としたいのですがうまくいきません。 strtokを使って、その後にstrcatで連結させようとしたのですが・・・。教えてください><
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>C:\\programfileを表示させたいのですがうまくいきません。 #2のプログラムでは、 最後の「\」を見つけて、その次の文字を「'\0'」に置き換えています。 "C:\\programfile\\\0" にするというような意味合いです。 *(p+1)='\0'; でそれをやっています。 pが最後の「¥」の位置です。 これを取り除くなら *p='\0'; とします。
その他の回答 (5)
- koma1000nin
- ベストアンサー率30% (342/1133)
No.2の補足に対する回答 No.2さんのプログラムは、「\\LOG」を切り取っているのではなく、「LOG」を切り取っているのです。 だから、途中経過の表示は C:\programfile\ になって当然です。この表示で正しいです。 この末尾に"RESULT"を連結すればOKですよ。 なお記述上は"\\"ですけれども、メモリ上では"\"になっていることを再認識してください。 一文字目の\はエスケープシーケンスを表す記号で、二文字目の\がホンモノです。 "\n","\t","\0"等を思い出してください。これらは「二つで一文字」です。
- koma1000nin
- ベストアンサー率30% (342/1133)
まず、"LOG"の位置を求めなさい。 求まった位置に'\0'を上かぶせで格納します。 こうして作った文字列"C:\\programfile\\"にstrcat()を用いて"RESULT"文字列を連結します。 ただし、元の文字列"C:\\programfile\\LOG"より三文字長くなりますから、事前にじゅうぶんな長さのストレージへ移しておいてから処理にとりかかりましょう。
- coredump
- ベストアンサー率46% (12/26)
僕は汎用の文字列置き換え関数を作って使っています。 ただ、バッファーオーバーフローはチェックしていない ので要注意です。 #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)
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); }
- shyun-k
- ベストアンサー率50% (12/24)
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"を連結 これでうまくいくと思います。 該当部分のコードだけですからあとは自分で補完して下さいね。
補足
おはようございます。 やり方を変えてC:\\programfile\\LOG の\\LOGを切り取って C:\\programfileを表示させたいのですがうまくいきません。 どうしてもC:\\programfile\と表示され'\'が最後残ってしまいます・・・。 アドバイスお願い致します。