2020年1月12日 星期日

字串切割與串接

題目:
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比較好懂。

程式碼:
#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++;
 }
}

沒有留言:

張貼留言