2017-03-16 56 views
-5

存在與字符串中C.編譯器序列化的問題不能正確接受的格式類型,即使類型等價:序列化字符串的

unsigned int voltage = 24; 
unsigned int cfac = 23; 
char buf[100]; 
sprintf("echo Voltage: %u, Cfac: %u > v.txt", voltage, cfac); 
system(buf); 

然而,編譯器被不正確地解釋無符號整數作爲指針:

錯誤:無效的轉換,從 '無符號整型' 到 '爲const char *'

我仔細檢查%u是unsigned int類型,而不是爲const char *然而,這編譯器不會解決。有人能解釋我爲什麼這個GNU編譯器是如此糟糕的代碼工作在Visual Studio我知道一個事實。

問候 普拉迪普

+0

即使用Visual Studio的C/C++編譯器進行編譯,您在運行時也會遇到訪問衝突。所以不,這個代碼在Visual Studio中不起作用。 –

+0

是的,但至少它編譯。與GNU甚至沒有編譯,這表明自由軟件質量低於微軟 –

+1

「編譯」是不是一件好事,當代碼是錯誤的。 –

回答

4

sprintf()第一個參數是buf,而不是格式字符串。

另外,不要使用sprintf(),因爲它可能會導致緩衝區溢出,使用snprintf()或同等替代,

int length; 
length = snprintf(buf, sizeof buf, "echo Voltage: %u, Cfac: %u > v.txt", voltage, cfac); 
if ((length != -1) && (length < sizeof buf)) { 
    system(buf); 
} 

最後,使用system()執行echo是非常沒有意義的。

因爲你的代碼顯然是相當於

FILE *file = fopen("v.txt", "w"); 
if (file != NULL) { 
    fprintf(file, "Voltage: %u, Cfac: %u", voltage, cfac); 
    fclose(file); 
} 

如果將調用外殼,你應該與你的程序的輸出這樣做,而不是從你的程序中。閱讀關於unix哲學,雖然不完美,但他們真的知道這一點,而unix方式就是這樣。

+0

system()是將字符串寫入文件 –