原因與你和你的名字的區別是一樣的。用戶在程序運行之前鍵入「./test 12 4」,用戶正在使用的命令外殼程序準備了兩個數字序列,這兩個數字序列表示文本字符,它們構成用戶號碼的名稱並將它們提供給您的程序 - shell從用戶輸入的終端直接獲取這些內容。
爲了添加這些序列通過名稱標識的數字,您需要使用將這兩個名稱轉換爲int
的函數 - 它們標識哪些數字是爲哪個添加定義的。這個函數被稱爲'atoi',兩個名字是序列{49,50,0}
和{52,0}
(表示符號序列{'1','2','\0'}
和{'4', '\0'}
)。 0
(也寫作'\0'
)是一個特殊符號的代碼,不能直接打印或輸入(這是一個謊言,但我不想進入),它被添加到名稱的末尾,以便atoi
,因爲它通過字符代碼讀取名稱字符代碼,知道它何時到達結尾。請注意,這些特定的值取決於您使用的平臺,但我認爲它是一個使用ascii或utf-8的平臺,而不是像ebcdic這樣的平臺。
印刷所產生的號碼的一部分,printf
使用"%d"
指令,接受代表的回答(你從增加兩個int
的得到)的int
方式,並將其轉換回至名的答案作爲準備發送回終端的字符代碼{49,56}
({'1','6'}
)。由於printf
在這裏沒有指示結束,因此我在輸出代碼中忽略了任何可能的終止0
('\0'
),這與您在shell輸入中收到的結束指示不同 - 終端無法在相同的終端中查找atoi
的做法和printf
不會給你C程序中的進一步用法的名稱;它只是將名稱從程序中直接發送到終端(這是命令shell連接到程序輸出流的地方)。
儘管atoi
不是您使用傳入名稱進行數字處理的唯一方法,但C語言旨在爲每個argv
元素提供結束標記,因爲它通常會用於您可能做出的任何其他選擇用於處理傳入的信息。
試試這個,看看被明確使用的代碼(仍然假設你的系統使用ASCII或UTF-8):
#include <stdio.h>
#include <stdlib.h>
char const name_of_program[] = "./test";
char const name_of_first_number[] = {49,50,0}; // {'1','2','\0'} would be the same as would "12" - with the quotes
char const name_of_second_number[] = {52,0}; // {'4','\0'} would be the same as would "4" - with the quotes
int main()
{
char const *argv[] = {
name_of_program,
name_of_first_number,
name_of_second_number,
NULL,
};
int sum = 0;
sum = atoi(argv[1])+atoi(argv[2]);
printf("The sum is : %d \n", sum);
return 0;
}
當你說「琴絃」用C他們是`字符*`,即指針
到一個字符數組,當你做argv [1] + argv [2]時,你將指針加在一起。 –
'argv [1] + argv [2]'意思是在C中添加兩個指針(它會導致錯誤爲無效操作)。 – BLUEPIXY
您讀取的關鍵是「將字符串轉換爲整數」。沒有這個,你有一個字符串,而不是一個數字。 C不像腳本語言,它經常試圖將值轉換爲你需要的類型。在C中,你需要明確你想要什麼。 –