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

Aeron-A發表於2019-01-09

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

/*
    本次任務使用字元分類函式來實現atoi()函式。
    如果輸入的字串不是純數字,該函式返回0。
*/
/*
    思路:麻煩在開始前別這麼想 —— 函式中迴圈體裡面直接用if isalpha isdigit判斷是否為數字或字母
         然後把數字賦值給一個變數。。。。。我想說。。。你對著數字仔細想想吧。。
    好吧迴歸正題,我打算建立一個char 的字元陣列。 可能看到這裡你們就知道了。 
    char inte[o] = { '1' , '2', '3' …… }  看到這個就懂了吧。 
    賦值操作很簡單, for迴圈, i = 0, i小於當前元素的下標, i++ 
                     變數2 *= 10, 這樣第一個元素是個位,根本不會進入迴圈體。
                                   第二個元素是10位,剛好迴圈只會執行一次。 其他以此類推。 
                    然後把變數2的值(當前)+上變數1(上一位數)的值,就完成了賦值操作。
    更具體請前往 Line 65 檢視函式的實現。
*/

/*
	本次任務使用字元分類函式來實現atoi()函式。
	如果輸入的字串不是純數字,該函式返回0。
*/
/*
	思路:麻煩在開始前別這麼想 —— 函式中迴圈體裡面直接用if isalpha isdigit判斷是否為數字或字母
	     然後把數字賦值給一個變數。。。。。我想說。。。你對著數字仔細想想吧。。
	好吧迴歸正題,我打算建立一個char 的字元陣列。 可能看到這裡你們就知道了。 
	char inte[o] = { '1' , '2', '3' …… }  看到這個就懂了吧。 
	賦值操作很簡單, for迴圈, i = 0, i小於當前元素的下標, i++ 
	                 變數2 *= 10, 這樣第一個元素是個位,根本不會進入迴圈體。
	                 			  第二個元素是10位,剛好迴圈只會執行一次。 其他以此類推。 
					然後把變數2的值(當前)+上變數1(上一位數)的值,就完成了賦值操作。
	更具體請前往 Line 65 檢視函式的實現。
*/
#include<stdio.h>
#include<ctype.h>

#define o 100

int my_atoi(char *s);

int main(void)
{
	char integer[o] = {};
	int num = 0;

	printf("Please input a integer string(return 0 for letter):\n");

	scanf("%s",integer);

	num = my_atoi(integer);

	printf("\nThe integer is %d. \n", num);

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

	return 0;
}

int my_atoi(char *s)
{
	int i = 0;
	int ret = 0;
	int temp = 0;
	int limit = 0;

	char integer[o] = {};

	// 這裡先把原陣列裡面的數字給擷取出來,然後賦值給新的陣列,成為字元陣列。
	while( *s != '\0' )
	{
		if( isalpha(*s) )
		{
			ret = 0;
			return ret;
		}
		else if( isdigit(*s) )
		{
			integer[i] = *s;
			i++;
			limit++;
			s++;
		}
	}
	// 因為迭代後才判斷,所以多了一位。
	limit--;

	// 接著進行賦值操作,思路在檔案頭有闡述過,不懂的看下面的實現,我的表達能力可能有待提升。。
	for(i = 0; i <= limit; i++)
	{
		// 這裡先把當前的數字取出來,舉例: '1','2','4','6' 如果要變成整數就是 1246
		// 1*1000 = 1*10*10*10 ,   1000 + 246
		//  2*100 = 2*10*10 ,      1200 + 46 
		//    4*10 ,			   1240 + 6
		//      6				   1246
		// 如果這樣子還看不懂我的思路,我也沒辦法了。
		// 另外,-48 是因為,當int(integer[i]) 這樣時,是把 作為字元的'1'從char轉換為int,
		// 但是,是數字對應的ASCII碼!! 1為49,2為50,9為57, 0 為 58。。
		temp = int(integer[i]) - 48;

		for(int j = i; j < limit; j++)
		{
			temp *= 10;
		}

		ret += temp;
	}

	return ret;
}


/*
————瀾氏專屬:轉載請註明來源,Github與CSDN的網址。
*/

 

相關文章