2013-11-15 109 views
0
/* test1.c */ 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int m = 11; 
    system("./test2 m"); 
    return 0; 
} 

上述程序打印0傳遞變量參數,以一個C程序,而我希望它來打印11.從命令行

/* test2.c */ 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    int m = atoi(argv[1]); 
    printf("%d\n", m); 
    return 0; 
} 

有人可以提供解釋?另外什麼是正確的方式來打印所需的11?

+1

拒絕檢查整數解析是否成功是您自己的錯。在每一步做盲目的假設不是編寫程序的方式。 –

回答

3

系統()函數只需要一個字符串作爲它的參數。它不知道你有一個名字爲m的變量,它應該用字符串替換這個變量(這在C語言中是不可能的,用這樣的語法。)

這意味着你正在執行你的第二個程序這樣的:

./test2 m 

你2程序不atoi(argv[1]);,那麼這將是相同的atoi("m");,這使的atoi()返回0。

你需要建立你想系統的字符串()來執行

int main(int argc, char *argv[]) 
{ 
    char command[128]; 
    int m = 11; 
    sprintf(command , "./test2 %d", m); 
    system(command); 
    return 0; 
} 
4

您正在將字符m傳遞到命令行,而不是其值。

3

C不會像Perl那樣擴展字符串常量中的變量,因此您的命令字符串中的m是一個字符串常量。

你需要做的是打印的m價值的命令字符串:

/* test1.c */ 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    int m = 11; 
    char buf[100]; 
    sprintf(buf, "./test2 %d", m); 
    system(buf); 
    return 0; 
} 
+0

有趣的是,我們是如何在這裏找到相同的解決方案的,y?但是你在'm'之前忘了'int';) – Atle

+0

謝謝。我的錯誤是我認爲test1.c正在編譯,所以我沒有掃描語法錯誤。 並不奇怪它們是相同的,因爲它是最簡單和最直接的解決方案。 –

+2

我有這個線程運行在我的頭上,它始終掃描語法錯誤。雖然停止工作凌晨2點左右。 – Atle