指標是c語言的精髓,用指標進行文字內容解析等處理在開發過程中非常常見,這裡我寫了乙個」指針對文字進行字串替換操作的**「,作為練習。
用vs2017環境編譯,因為本人偏愛日誌除錯的方法,所以**裡日誌列印內容佔了一定的行數。**執行前要在對應目錄(見**裡的巨集定義)下建立文字文件,用於除錯。
file operation by pointer.c **
#include "stdafx.h"
#define srcpath "e:\\ccode\\test1\\replace src file.txt"
#define dstpath "e:\\ccode\\test1\\replace dest file.txt"
#define logpath "e:\\ccode\\test1\\log.txt"
#define pre_replace_string "emperor"
#define aft_replace_string "emperor"
int main()
else
//用檔案控制代碼讀取需要做字串替換處理的原始檔內容,並放置於before_process_content[max_unit]中
char before_process_content[max_unit] = ;
char after_process_content[max_unit] = ;
readsize= fread(before_process_content, 1, srcsize, fp_srcfile);
if (0 == readsize)
else
printf("content of source file is : [%s]", before_process_content);
//檔案控制代碼用完後需要關閉並置null
if (fp_srcfile != null)
//處理檔案內容,將before_process_content處理成after_process_content
if (0 != contentprocess(before_process_content, srcsize, after_process_content))
else
//處理後的檔案內容寫入目標檔案中
memset(szname, 0, sizeof(szname));
strcpy_s(szname, max_name, dstpath);
//用檔案控制代碼開啟需要儲存字串替換處理後結果的檔案
err = fopen_s(&fp_dstfile, szname, "at+");
if (0 != err)
else
if (fp_dstfile != null)
else
//檔案控制代碼用完後需要關閉並置null
fclose(fp_dstfile);
fp_dstfile = null;
} return 0;
}//獲取此刻時間用於日誌列印
void get_local_time(char* buffer)
// 寫日誌檔案
int write_log_file(char* filename, char* buffer, int buf_size)
; get_local_time(now);
//將日誌所有內容寫入logcontent,以備列印到日誌檔案中
snprintf(logcontent, max_log, "time:%s %s\n", now, buffer);
//呼叫檔案控制代碼fp_log開啟日誌檔案logpath
err = fopen_s(&fp_log, (char*)filename, "at+");
if (0 != err)
if (fp_log != null)
else
return -1;
return 0;
}int contentprocess(char* inbuffer, int size, char* outbuffer)
; char dst_string[32] = ;
strcpy_s(src_string, sizeof(pre_replace_string), pre_replace_string);
strcpy_s(dst_string, sizeof(aft_replace_string), aft_replace_string);
char* p;
char logbody[max_log];
snprintf(logbody, max_log, "line:[%d] entering contentprocess procedure, contentsize:[%d]", __line__, size);
write_log_file((char*)logpath, logbody, strlen(logbody));
//搜尋第乙個被替換字串
memcpy(outbuffer, inbuffer, strlen(inbuffer));
p = strstr(outbuffer, src_string);
//用while迴圈去 搜尋 替換 計數
while (p)
if (0 == count) //搜尋第乙個被替換字串就失敗,未進入while迴圈
else
return 0;
}void str_replace(char * cp, int length_of_srcstr, char * dst_str)
*(tmp - (length_of_srcstr - length_of_dststr)) = *tmp; //把末尾的 '\0' 也要移動
} else
//若被替換字串的長度小於替換字串的長度,在替換操作裡原始檔內容部分需要整體往後移動
if (length_of_dststr> length_of_srcstr)
}//在之前移動產生的位置裡填上替換字元
memcpy(cp, dst_str, length_of_dststr);
}
標頭檔案stdafx.h
#include "targetver.h"
#include #include #include#include#include#include#include#define max_log 256
#define max_name 128
#define max_unit 10240
int write_log_file(char* filename, char* buffer, int buf_size);
int contentprocess(char* inbuffer, int size, char* outbuffer);
void str_replace(char * cp, int length_of_srcstr, char * dst_str);
選取一篇翻譯界佳作(英文版出師表)來作為測試文字內容,將emperor替換為e mperor
replace src file:
replace dest file:
測試日誌:
time:2018-01-05 22:09:06 line:[36] open file [e:\ccode\test1\replace src file.txt] succ.
time:2018-01-05 22:09:06 line:[52] read file [e:\ccode\test1\replace src file.txt] succ.
time:2018-01-05 22:09:06 line:[178] entering contentprocess procedure, contentsize:[2335]
time:2018-01-05 22:09:06 line:[201] [emperor] is replaced by [emperor], replace count number is :[12].
time:2018-01-05 22:09:06 line:[73] content process succ!
time:2018-01-05 22:09:06 line:[91] open file [e:\ccode\test1\replace dest file.txt]succ.
time:2018-01-05 22:09:06 line:[106] wtite file to [e:\ccode\test1\replace dest file.txt] succ.
對文字中的字串進行排序(C語言)
對文字中的字串進行排序,文字中一行乙個字串。include include define limt 100 一行文字的最大長度 define maxlen 10000 define maxline 1000 char string maxlen 存放所有的字串 char linesp maxline...
C語言提高 2 第二天 用指針對字串進行操作
2 昨日回顧 把位址轉換成整型 加上它所指向的資料的大小 3指標成立條件和間接賦值 條件一 有兩個變數 其中至少乙個是指標 條件二 建立關聯 條件三 間接操作 4間接操作的例子 5間接操作的記憶體四區圖 6 指標做為函式引數的意義 7指標的總結 8字串 指標和陣列名的區別 1.sizeof 2.st...
使用指標的指針對字串排序
1 note your choice is c ide 2 include stdio.h 3 include string.h 4 使用指標的指針對字串排序 5 排序是按照漢字的首字母進行 6 7 整體思路 1 輸出排序前的陣列元素89 2 輸出排序後的陣列元素 1011 12 自定義函式sort...