アプリ版:「スタンプのみでお礼する」機能のリリースについて

をしたのですが

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

A 回答 (6件)

>C:\\programfileを表示させたいのですがうまくいきません。


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

No.2の補足に対する回答


No.2さんのプログラムは、「\\LOG」を切り取っているのではなく、「LOG」を切り取っているのです。
だから、途中経過の表示は

C:\programfile\

になって当然です。この表示で正しいです。
この末尾に"RESULT"を連結すればOKですよ。

なお記述上は"\\"ですけれども、メモリ上では"\"になっていることを再認識してください。
一文字目の\はエスケープシーケンスを表す記号で、二文字目の\がホンモノです。
"\n","\t","\0"等を思い出してください。これらは「二つで一文字」です。
    • good
    • 0

まず、"LOG"の位置を求めなさい。



求まった位置に'\0'を上かぶせで格納します。

こうして作った文字列"C:\\programfile\\"にstrcat()を用いて"RESULT"文字列を連結します。

ただし、元の文字列"C:\\programfile\\LOG"より三文字長くなりますから、事前にじゅうぶんな長さのストレージへ移しておいてから処理にとりかかりましょう。
    • good
    • 0

僕は汎用の文字列置き換え関数を作って使っています。


ただ、バッファーオーバーフローはチェックしていない
ので要注意です。

#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;
}
    • good
    • 1

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);
}

この回答への補足

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

補足日時:2005/06/18 09:20
    • good
    • 0

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"を連結

これでうまくいくと思います。
該当部分のコードだけですからあとは自分で補完して下さいね。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!