No.6ベストアンサー
- 回答日時:
>C:\\programfileを表示させたいのですがうまくいきません。
#2のプログラムでは、
最後の「\」を見つけて、その次の文字を「'\0'」に置き換えています。
"C:\\programfile\\\0"
にするというような意味合いです。
*(p+1)='\0';
でそれをやっています。
pが最後の「¥」の位置です。
これを取り除くなら
*p='\0';
とします。
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"より三文字長くなりますから、事前にじゅうぶんな長さのストレージへ移しておいてから処理にとりかかりましょう。
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;
}
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);
}
この回答への補足
おはようございます。
やり方を変えてC:\\programfile\\LOG
の\\LOGを切り取って
C:\\programfileを表示させたいのですがうまくいきません。
どうしてもC:\\programfile\と表示され'\'が最後残ってしまいます・・・。
アドバイスお願い致します。
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"を連結
これでうまくいくと思います。
該当部分のコードだけですからあとは自分で補完して下さいね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) awkの文字列比較はPOSIXロケールまたはCロケールにおいてバイナリ値の比較に使えるか gawkな 1 2023/04/22 09:21
- Excel(エクセル) Excelのマクロで、特定のセルから順番に値を取得したい 5 2022/12/06 15:34
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Visual Basic(VBA) Excel VBA 教えてください。 VBA初心者です。 詳しい方がいましたら教えてください。 下記 3 2023/04/25 11:22
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- Ruby power BI クエリエディター 〇〇を含む文字列置換 1 2022/10/16 17:34
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
char形配列の整数を抜き出したい
-
文字列内の数字削除
-
c言語でcsvファイルの処理で、...
-
文字型配列に格納した空白の切捨て
-
文字列配列を動的に割り当てる...
-
エクセルのMID関数は、C言語では?
-
CStringからchar*への型変換に...
-
c言語でポインタ変数を用いた配...
-
C言語のintとcharの違いってな...
-
DWORDとcharの変換
-
C言語のプログラムについてです
-
関数について
-
ListViewのソートについて
-
戻り値で構造体を返すことは可...
-
関数から配列を返すには?
-
セグメントエラー
-
C言語 配列の長さの上限
-
System.IO.Directory.GetFiles...
-
プーさんのマウスポインタを教...
-
DataGridView の sort
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のintとcharの違いってな...
-
char*を初期化したいのですが
-
C言語にて構造体のメンバがNULL...
-
CStringからchar*への型変換に...
-
strcat関数を自作したいです
-
new charとnew char[N]の違いは?
-
csvファイルをfscanfで読み込む...
-
char型にint型の数値を代入する。
-
動的メモリの初期化方法について。
-
C言語で文字列をかえす正しい書...
-
文字列str内の全ての数字を...
-
char 文字列型 の表現範囲が-12...
-
DWORDとcharの変換
-
fstream型オブジェクトを関数の...
-
小数点入りの文字列をfloat型に...
-
C言語のプログラムについてです
-
const char* s1とただのchar s1...
-
文字列内の数字削除
-
c言語でポインタ変数を用いた配...
-
szとlpszの違い
おすすめ情報