2017-08-28 88 views
-2

我已經寫了一個程序,從用戶採取2個參數,並將它們加在一起,例如,如果用戶把./test 12 4它會打印出總和是:16有人可以向我解釋這是如何實際工作(atoi)

是困惑我是爲什麼我不得不使用atoi,我不能只用argv[1] + argv[2]

我知道atoi使用字符串轉換爲整數,我發現部分這行代碼在線幫助我與我的程序,但可以有人向我解釋爲什麼我需要它:

sum = atoi(argv[1])+atoi(argv[2]); 

代碼:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 

    int sum = 0; 

    sum = atoi(argv[1])+atoi(argv[2]); 
    printf("The sum is : %d \n", sum); 
    return 0; 
} 
+2

到一個字符數組,當你做argv [1] + argv [2]時,你將指針加在一起。 –

+2

'argv [1] + argv [2]'意思是在C中添加兩個指針(它會導致錯誤爲無效操作)。 – BLUEPIXY

+2

您讀取的關鍵是「將字符串轉換爲整數」。沒有這個,你有一個字符串,而不是一個數字。 C不像腳本語言,它經常試圖將值轉換爲你需要的類型。在C中,你需要明確你想要什麼。 –

回答

0

原因與你和你的名字的區別是一樣的。用戶在程序運行之前鍵入「./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他們是`字符*`,即指針
0

argv[i]是C型字符串默認:

int main(int argc, char *argv[]) 

和總和型int

即使您輸入了一個數字,編譯器也會將其讀取爲char*atoi()使其讀取爲int,因此您可以使用它進行算術計算。

【答案更新感謝評論波紋管]

+1

更正:atoi不會*轉換*指向int的指針,它*將C字符串的開頭轉換爲'int'。一個強制轉換由C標準定義爲 「在帶有括號的類型名稱之前,表達式的值將表達式的值轉換爲指定的類型,此構造稱爲強制轉換。」 – codeshot

+1

它不被讀爲'char *',它被讀入爲一個C字符串,它由一個字符代碼序列組成,在一個對象中由一個nul字符結尾,其有效的開始點由一個' char *'或'char const *'。所以還有更多。這不僅僅是迂腐,學習者在認識到指針是一個字符串時往往誤解了他們的理解,於是他們繼續犯了很多不必要的錯誤。 – codeshot

+0

@codeshot感謝您的提醒。我用你的意見更新了答案。 – hackela

0

「是困惑我的部分是爲什麼我必須使用‘的atoi’我不能只是使用的argv [1] +的argv [2] 「 argv參數保存程序可以作爲輸入的字符串列表。 C語言不會自動將字符串轉換爲數字,所以您必須自己做。 atoi函數將一個字符串作爲參數並返回一個整數,然後可以將其用於所需的算術運算。 在其他語言(如C++)中,求和字符串通常會將它們連接起來,但在C中,您將收到編譯器錯誤。

相關問題