Read a char array from .txt file, then using the following operations, “append, split, copy”to the string and show the results(on cmd window).
Each operation should be implement as a function with predefined input and output.
//copy the value from src to dist. void copy(char *src, char *dist); //append the text after target. void append(char *target, char *text); //split src char array to two part by target, then output the left and right part by segmentA and segmentB. void split(char *src, char target, char *segmentA, char *segmentB);
Input(filename: input.txt)
First line : input char array
Second line : append text
Third line: Split Char
Other line: Remove
Output
Append result
Original char array
Split result
(add linebreak after each segments, and change first letter from lowercase to uppercase)
Student ID
解題思路:
此題主要是練習讀檔以及運用字元陣列對字串處理,因此不能使用strnpy等函式。
先把第一行、第二行字串分別存起來後,copy的函式就是再準備一個空的char array,從頭一個字元一個字元開始存,只要不是空字元就放到空的array裡。
append的函式是先找到要串接的字串的尾巴,然後再把待加內容一個個加進去,直到待加內容也指到空字元。
split直接看下面程式碼吧~感覺看code比較好懂。
先把第一行、第二行字串分別存起來後,copy的函式就是再準備一個空的char array,從頭一個字元一個字元開始存,只要不是空字元就放到空的array裡。
append的函式是先找到要串接的字串的尾巴,然後再把待加內容一個個加進去,直到待加內容也指到空字元。
split直接看下面程式碼吧~感覺看code比較好懂。
程式碼:
#include<stdio.h> #include<string.h> #include"FileHandler.h" void copy(char *src, char *dist); void append(char *target, char *text); void split(char *src, char target, char *segmentA, char *segmentB); int main() { int i_str = 0,line1_length=0,line2_length=0; char *str = readAllTextFromFile("../input.txt"), segmentA[200] = { '\0' }, segmentB[200] = { '\0' }; char line1[200] = { '\0' }, line2[200] = { '\0' }, append_result[200] = { '\0' }, target[1] = { '\0' }; while (str[i_str] != '\n')//讀第一行資料 line1[line1_length++] = str[i_str++]; i_str++; printf("Input char array:%s\n\n", line1); while (str[i_str] != '\n')//讀第二行資料 line2[line2_length++] = *(str + i_str++); i_str++; printf("Append text:%s\n", line2); copy(line1, append_result); append(line2, append_result); printf("Append result:%s\n\n", append_result); printf("Original char array:%s\n\n", line1); target[0] = str[i_str++]; printf("Split char:%c\n",target[0]); printf("Split result:\n"); split(append_result, target[0], segmentA, segmentB); /*system("pause");*/ return 0; } void copy(char *src, char *dist) { int i = 0; while (src[i] != '\0')//把src的資料都複製給dist { dist[i] = src[i]; i++; } } void append(char *target, char *text) { int i = 0, j = 0; while (text[i] != '\0')//把原本內容尾端先找出來 i++; while (text[j] != '\0')//再加上去 { text[i] = target[j]; i++; j++; } } void split(char *src, char target, char *segmentA, char *segmentB) { //src是要被分割的句子,依target被分割到A與B裡 int i = 0,j=0,k=0,m=0; while (segmentA[m] != '\0')//把上一次的清空 segmentA[m++] = '\0'; m = 0; while (segmentB[m] != '\0')//把上一次的清空 segmentB[m++] = '\0'; while (src[i] != target && src[i] != '\0')//如果剩下的句子不是目標字元也不是空字元 segmentA[j++] = src[i++];//就存到A裡面 i++;//跳過目標字元 while (src[i] != '\0')//再把剩下的存到B裡面 segmentB[k++] = src[i++]; if ('a'<=segmentA[0]&&segmentA[0]<='z')//把行首字母變大寫 segmentA[0] -= 32; printf("%s\n", segmentA);//把分好的印出來 int l = 0; while (segmentB[l] != '\0')//把剩下的句子判斷,如果還需要分或還沒印完 { if (segmentB[l] == target || segmentB[l + 1] == '\0') { split(segmentB, target, segmentA, src); break; } l++; } }
沒有留言:
張貼留言