c語言程式設計常見問題總結(1)
總結1:
將全域性變數放在會被多次呼叫的標頭檔案中,編譯會報錯:該變數被多次定義,所以是最好把全域性變數放在.c檔案中。
總結2:
Getche()函式,輸入後立即從控制檯取字元,不以回車為結束(帶回顯);
Getch()是一個不回顯函式,當用戶按下某個字元時,函式自動讀取,無需按回車,有的C語言命令列程式會用到此函式做遊戲。
這兩個函式不是標準函式,在conin.h中,移植時需要注意。
總結3:
終端覆蓋當前行方式
測試:
#include <stdio.h>
int main()
{
printf("Hello \n");
printf("Test 1");
printf("\rTest 2\n");
return 0;
}
輸出:
Hello
Test 2
總結4:
終端某些字元不變,只是個別字元隨著鍵盤輸入改變,可以將游標網上移動n位,然後重新覆蓋列印,就可以了。
總結5:
Socket程式設計,server accept: Invalid argument
socklen_t clilen;
struct sockaddr_in clientaddr;
connfd = accept(listenfd,(sockaddr *)&clientaddr,&clilen);
問題就出在accept的第3個引數:必須為正數,把那個變數初始化一下就好了~
socklen_t clilen= sizeof(struct sockaddr);
struct sockaddr_in clientaddr;
connfd = accept(listenfd,(sockaddr *)&clientaddr,&clilen);
總結6:
Shell指令碼出現以下錯誤:
gcc:fatal error:no input files (致命錯誤)
compilation terminated.(編譯終止)
導致的原因可能是,gcc後面的檔名有錯誤,編譯器沒有找到。
總結7:
Shell指令碼出現以下錯誤:
./cs 行17:-f:未找到命令
導致的原因可能是,if A[ A-fA${target}A];,A是空格,缺少其中一個空格,這幾個空格都不能少,這裡的分號;有沒有,我這邊用gcc(ubuntu 7.2.0)編譯,執行結果都是一樣的,沒有報錯。
Linux的man命令等級:
man 分為1 2 3 4 5 6 7 8等級別
1、Standard commands (標準命令)
2、System calls (系統呼叫)
3、Library functions (庫函式)
4、Special devices (裝置說明)
5、File formats (檔案格式)
6、Games and toys (遊戲和娛樂)
7、Miscellaneous (雜項)
8、Administrative Commands (管理員命令)
比如man socket, 可以發現SEE ALSO中包括ACCEPT(2)等等,可以通過man 2 accept 檢視
總結8:
Socket AF_UNIX程式設計問題:
Bind:address already in use,
Connect:connection refused.
可以採取以下的方式解決,但這個方法不一定唯一:在socket建立之前加unlink(“server_socket”),在socket關閉之後,加unlink(“server_socket”)。個人測試,建立前的必須加,關閉之後是可以不加,但是建議都加上,比較安全。
總結9:
Socket 程式設計編譯問題:
/*接受客戶端請求; 第2個引數用來儲存客戶端地址; 第3個引數用來儲存客戶端地址的大小*/
/*建立(返回)一個到客戶端的檔案描述符,用以對客戶端的讀寫操作*/
client_sockfd = accept (server_sockfd, (struct sockaddr *)&client_address, (socklen_t*)&client_len);
在使用accept函式之後,會產生一個新的socket描述符,另外的伺服器描述符又去繼續接聽其他的客戶端了。所以程式設計建議是開始定義兩個描述符,server_sockfd和client_sockfd。