C primer plus 第六版 第十一章 第十題 程式設計練習答案

Aeron-A發表於2018-12-28

Github地址:φ(>ω<*)這裡這裡。

/*
    本次任務為編寫一個函式接受一個字串作為引數,並刪除字串中的空格。
    在一個程式中測試該海曙,使用迴圈讀入輸入行,知道使用者輸入一行空行。
    該程式應該應用該函式讀取每個輸入的字串,並顯示處理後的結果。
*/

#include<stdio.h>

#define o 100

void del(char * s1);

int main(void)
{
	int i = 0;
	char name[o] = {};

	while(true)
	{
		printf("Please input(Empty line to quit): \n");
		fgets(name, o, stdin);
		
		if(name[0] == '\n')
		{
			break;
		}

		// 處理 fgets()的換行符。
		i = 0;
		while(name[i] != '\n')
		{
			i++;
		}
		if(name[i] == '\n')
		{
			name[i] = '\0';
		}

		del(name);
	}

	printf("Bye~\n");
	getchar();

	return 0;
}

void del(char * s1)
{	
	// 思路:這個刪除操作啊。。。我打算用迴圈,遍歷name陣列的值,然後用另外一個陣列儲存字串。
	// 把純字元文字儲存完畢再遍歷一遍拷貝進去。
	// 所以這個指向開頭的指標很重要。。。。
	int i = 0;
	char name2[o] = {};

	char * star;
	star = s1;

	// 這是第一步,把純文字儲存進一個陣列。
	while(*s1 != '\0')
	{
		// 這個拷貝就是把沒有空格字元的純字元文字拷貝到一個新的陣列。
		if(*s1 == ' ')
		{
			s1++;
			continue;
		}

		name2[i] = *s1;
		s1++;
		i++;
	}
	name2[i] = '\0';  // 別忘了末尾的空字元哦。。

	// 這是第二步,重新給name陣列賦值。
	i = 0;
	s1 = star;
	while(name2[i] != '\0')
	{
		*s1 = name2[i];
		printf("\nHow about this s1 : %c. and i %d..\n", *s1, i);
		s1++;
		i++;
	}

	*(s1) = '\0';
/* 
  這樣重寫就相當於把純文字文件覆蓋原陣列了,然後再新增一個\0。
  這樣就是兩個字串,一個是純文字文件+\0;另外一個是原陣列剩下的字元加+\0。
  這麼說應該懂我的思路了吧。。雖然上面有寫。 
*/



	printf("\nThis is the result:\n");
	while(*star != '\0')
	{	
		printf("%c", *star);
		star++;
	}

	putchar('\n');

	return;
}

 

相關文章