linux下程式設計時遇到的字元小問題

2022-04-21 17:46:13 字數 1085 閱讀 9919

這學期開了一門unix網路程式設計,對於很多人來說貌似比較頭痛,還好,我上學期有認真學習了unix環境高階程式設計,基礎的一點東西還是懂的。

但是在編寫tcp訊息傳遞時遇到兩點問題。

問題一:

read 和 write函式的第二個引數(buf)是char* 格式,而我所用的字串是通過string類的c_str()方法轉換過來的,是const char* 格式,用後者給前者賦值時是不能通過編譯的,

網上查了一下,原因是char* 所指的字元 是可以更改的,而const char* 所指的字元不能更改(這個地球人都知道。。。),如果能夠把const char*賦給char*,那麼通過char*就可以更改const char*所指的內容,const char* 這樣的申明就顯得毫無用處了。因此在實現c++編譯器的時候,將 const t * 賦值給 t*(t為某種基礎型別)的情形定義為邏輯上的錯誤。

對比const char 為 char 賦值,這樣是可行的,因為這裡的賦值是值賦值,更改char不會影響const char 的內容。 const char*為char*賦值時不可行的,因為這裡是用位址為位址賦值,更改char* 的內容就等同於更改 const char*的內容。

另外,從這個觀點來看,用char* 來初始化 const char* 理論上是可以的。

問題二:

由於const char*不能給char*賦值,於是乎我就自己編寫了乙個小小的函式,初始化乙個長度為 const char*所指變數長度的char*變數,用乙個for迴圈來挨個賦值,

最後在傳值的時候,客戶端接收到的資訊始終都是「正確字串+一對亂七八糟的東西」。想了半天,原來for迴圈的時候光忙著拷貝值,忘了 char*格式的字串實際上是乙個

char陣列,最後必須以'\0'來結束,由於缺少了這個標誌,write函式將char位址後邊的一對不知為何物的東西當做字串的內容一同傳給了客戶端。

解決方法:

1.將char申明為const char*長度加1的陣列,最後手動加上'\0'。

2.使用strcpy(鬱悶,當時咋就沒想到。。。)

3.使用strcat(這個沒有試過,貌似不得行,,同學們自己回去試試吧)

4.使用strdup(這個也沒試過~)

程式設計中遇到的小bug

1.1空棧不能取頂。if stack.top stack.size 0 如果棧本身為空,這裡if中首先取棧頂,就會導致段錯誤 sigse segment fault 2.1字串定義的時候要申請空間,在沒申請空間 初始化 的情況下直接用下標訪問某處字元並不會儲存到字串中,其實那個地方仍舊是字串結束符 ...

安裝Linux時遇到的問題

對於linux來說,我還是乙個新手。這裡記載的是安裝使用過程中的問題。我需要在hp compaq商用機型上安裝linux redhat 9 首先對硬碟進行整理,劃分出乙個5g左右的空間供linux使用。這個空間最好在所有碟符的最後乙個盤裡劃分出來。可以使用網路提供的工具。我使用的是windows20...

程式設計時遇到的問題,以及回答

前期用到了一些函式,但是忘記了整理,從現在開始整理。1.cumtrapz 用這個函式進行離散資料積分是可行的,但是使用trapz求積分卻不行 這裡我針對trapz定義了區間,但是出來的線段不對勁 是這兩個函式的區別導致的錯誤嗎?還是我trapz使用錯誤?答 trapz只有最終值,而cumtrapz是...