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

Aeron-A發表於2018-12-26

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

/*
    本次任務設計並測試一個名為 char *srting_in(const char * s1, const char * s2) 的函式。
    本函式要求接收兩個指向字串的指標作為引數。 如果第二個字串包含在第一個字串,
    就返包含在第一個字串開始的地址。就是第一個字串有第二個字串相同內容的位置,第一個字母的地址。
*/

#include<stdio.h>

#define n 50

char *srting_in(char * s1, char * s2); 

int main(void)
{
	int i = 0;  // 建立這個變數是因為s2的換行符會妨礙字元匹配。
	char s1[n] = {};
	char s2[n] = {};
	char quit = 0;
	char * result = NULL;

	while(quit != 'q')
	{
		printf("Please input the first string(The limit is 20 character):\n");
		fgets(s1, n, stdin);
		fflush(stdin);
		printf("Please input the second string(The limit is 20 character):\n");
		fgets(s2, n, stdin);

		// 接下來的步驟都是處理換行符,直到 Line 38.
		while(s2[i] != '\n')
		{
			i++;
		}
		if(s2[i] == '\n')
		{
			s2[i] = '\0';
		}
		fflush(stdin);

		result = srting_in(s1, s2);

		if(result != NULL)
		{
			printf("\nThe string 2 is in string 1.. The address is %p. \n", result);
		}
		else
		{
			printf("\nThe sring 2 isn't in string 1.\n");
		}

		printf("Do you want to quit or continue(Enter 'q' to quit)?  Choies:\n");
		quit = getchar();
		fflush(stdin);
	}

	printf("Bye ~\n");

	getchar();

	return 0;
}

char *srting_in(char * s1, char * s2)
{	
	// 想法很簡單,找到相同首字母的時候,用兩個指標臨時存放當前位置,
	// 然後巢狀一個迴圈去繼續匹配。

	int i = 0;  // 這個i是用於在迴圈中識別是否匹配成功而退出。

	char * result2 = NULL;
	char * temporary1 = NULL;
	char * temporary2 = NULL;

	while(*s1 != '\n' && *s1 != '\0')
	{
		if(*s1 == *s2)
		{
			// 存放當前s1, s2的地址。
			temporary1 = s1;
			temporary2 = s2;

			while(*s2 != '\0')
			{
				if(*s1 != *s2)
				{
					break;
				}

				s1++;
				s2++;
			}

			if(*s2 == '\0')
			{
				i = 1;
			// 這裡的意思是,經過剛剛的while迴圈,如果s2目前指向的位置是空字元,
			// 說明s1跟s2已經匹配到s2結尾而沒有任何差錯,故匹配成功。接下來直接跳出大迴圈。
				break;
			}
			else
			{
			// 如果s2不是空字元,那麼說明匹配失敗,則繼續大迴圈匹配。
				s2 = temporary2;
			}
		}
		else
		{
			s1++;
		}
	}

	if(i > 0)
	{
		result2 = temporary1;
	}
	else
	{
		result2 = NULL;
	}	

	return result2;
}

 

相關文章