簡體   English   中英

strcat C無法打印並將int轉換為char *

[英]strcat C not printing and int to char*

我正在嘗試首先生成一個隨機數並將其轉換為字符串。 它可以正確執行,但是編譯器給出“警告:從不同大小的整數強制轉換為指針”。 然后,這里的主要問題是我試圖將字符串連接起來以建立響應,但是由於某種原因,即使第一個strcat也不起作用,它只是在那里停止了。

char *name, *cseq;
srand (time(NULL));
char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );

char* response = "RTSP/1.0 200 OK\nCSeq: ";                     
strcat( response, cseq );                   
strcat ( response, "\n" );                      
strcat ( response, "Session " );
strcat ( response, session );                       
strcat ( response, "\n\n" );

printf("Response: %s", response);

不,它不會“正確”地進行操作; 您的代碼很破損。 編譯器在發出警告時並不是想逗他們,他們通常都知道他們在說什么,是需要弄清楚導致您的代碼出警告的代碼出了什么問題。 因為應該沒有。

在您的情況下,此代碼例如:

char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );

是無效的,並且使用session就像指向有效字符串一樣)很可能會調用未定義的行為。

除非它們是以0終止的字節數組來描述以期望的編碼開頭的字符,否則您不能將其“轉換”為C語言中的字符串。

您需要使用sprintf()或類似的東西從隨機數創建字符串:

const int session_id = rand() % (9999 - 1000 + 1) + 1000;
char session[32];

snprintf(session, sizeof session, "%d", session_id);

當然,一旦開始使用snprintf() ,就可以將其用於所有格式設置,並刪除strcat() ,無論如何這都是一個非常鋒利的工具。

同樣,正如simonc指出的那樣,您不能像執行此操作那樣修改字符串。 您可能應該有以下內容:

char response[512];

snprintf(response, sizeof response, "RTSP/1.0 200 OK\nCSeq: %s\nSession %d\n\n",
         cseq, session_id);
printf("Response: '%s'", response);

請注意,這使用了上面的session_id ,但是一次調用snprintf()會進行所有格式化,因此不需要會話ID的臨時字符串版本。

當然,如果要從函數中return該值,則需要考慮緩沖區管理,因為它是一個局部變量,當函數退出時將超出范圍,因此不能按原樣返回response

char* response = "RTSP/1.0 200 OK\nCSeq: "; 

給您一個只讀的字符串文字。 您不能修改其內容。

一個快速而骯臟的解決方法是將response更改為可寫的長度,以硬編碼:

char response[200] = "RTSP/1.0 200 OK\nCSeq: "; 

更好的方法可能是先計算各種字符串成分的長度,然后malloc內存以進行response 如果這樣做,請確保稍后再打free電話。

除了unwind指出的session問題外,請注意,您的示例中的cseq未初始化,因此取消引用它會崩潰。

隨着以下

char *session = (char*) ( rand() % (9999 - 1000 + 1) + 1000 );

您將隨機數解釋為內存地址,這是合法的,但可能不是您想要的。 結果是您將隨機內存轉儲到響應中,從而獲得幸運(只有垃圾)和最壞的分段錯誤。 如果要將其轉換為字符串(例如1234->“ 1234”),則應使用類似

char session[6];
snprintf(session,6, "%d", rand() % (9999 - 1000 + 1) + 1000 );

(見前面的討論在這里 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM