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


沒有留言:
張貼留言