1. 程式人生 > >c語言程式設計常見問題總結(1)

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。