解説

  • CSVファイルに"を入れるためのエンコード、デコード処理のサンプルです。

ルール
  • CSVファイルに保存する場合、"は\"に、\は\\に変換して保存する
  • 読み込む場合は、逆に変換して元の値に戻す

やること
  • 文字列変換関数を作って、変換するだけ。。。。


ソース edCsv.c

// CSVファイルに"を入れるためのエンコード、デコード処理
// ルール CSVファイルに保存する場合、"は\"に、\は\\に変換して保存する
//      読み込む場合は、逆に変換して元の値に戻す
// やること 文字列変換関数を作って、変換するだけ。。。。
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
// 文字列置換関数
// パラメータ 1.対象文字列 2.変換結果格納バッファ 3.変換前文字列 4.変換後文字列
void chikan(const char *target, char *result, const char *before,
		const char *after) {
	char *p;
	int i = 0, size;
	int beforeSize = strlen(before);
	// 変換後の格納バッファを空っぽにする
	result[0] = '\0';
 
	// 検索結果がなくなるまでループを回す
	while (NULL != (p = strstr(&target[i], before))) {
		// 検索結果と処理済みカウンタからコピーする文字数を決める
		size = p - &target[i];
 
		// 検索結果の手前まで文字列をコピー
		strncat(result, &target[i], size);
 
		// 変換後文字列を追加する
		strcat(result, after);
 
		// カウンタにコピーした文字数と変換前文字列の文字数を追加する
		i = i + beforeSize + size;
	}
 
	// 検索結果の残りをresultに全部足す
	strcat(result, &target[i]);
}
int main(void) {
	// "と\を\"と\\にエンコード・デコードします
	char *target = "\",\"\\ \\\\";
	char r1[200], r2[200], r3[200], r4[200];
	char *before, *after;
 
	// エンコード
	printf("エンコード処理\n");
	// まず\を\\に変換します
	printf(" エンコード前の値 %s\n", target);
	before = "\\";
	after = "\\\\";
	chikan(target, r1, before, after);
	printf(" エンコード中の値 %s\n", r1);
 
	before = "\"";
	after = "\\\"";
	chikan(r1, r2, before, after);
	printf(" エンコード後の値 %s\n", r2);
 
	printf("デコード処理\n");
	printf(" デコード前の値 %s\n", r2);
	// デコード
	// \\を\に戻す
	before = "\\\\";
	after = "\\";
	chikan(r2, r3, before, after);
	printf(" デコード中の値 %s\n", r3);
 
	// \"を"に戻す
	before = "\\\"";
	after = "\"";
	chikan(r3, r4, before, after);
	printf(" デコード後の値 %s\n", r4);
 
	return EXIT_SUCCESS;
}
 

実行結果

エンコード処理
 エンコード前の値 ","\ \\
 エンコード中の値 ","\\ \\\\
 エンコード後の値 \",\"\\ \\\\
デコード処理
 デコード前の値 \",\"\\ \\\\
 デコード中の値 \",\"\ \\
 デコード後の値 ","\ \\

ideone ソースとかここからコピペできるかも


添付ファイル