2009-01-07 42 views
3

喲!如何將char []中的幾個字符複製到C中的char *?

我想從char []複製一些字符到char *。我只想從索引6到字符(消息長度-9)。

也許代碼示例將解釋我的問題更多:

char buffer[512] = "GET /testfile.htm HTTP/1.0"; 
char* filename; // I want *filename to hold only "/testfile.htm" 

msgLen = recv(connecting_socket, buffer, 512, 0); 
strncpy(filename, buffer+5, msgLen-9); 

任何反應會很多幫助!

+0

我想你的意思是「strncpy()函數(文件名......」,而不是「strncpy()函數(文件」 文件是不是在你的代碼中聲明的變量 – abelenky 2009-01-07 19:12:05

+0

這是正確的感謝。。。) – petsson 2009-01-07 19:30:49

回答

10

我假設你的意思是......

strncpy(filename, buffer+5, msgLen-9); 

問題是你還沒有分配的任何內存來保存你複製的字符。 「文件名」是一個指針,但它不指向任何東西。

要麼只是聲明

char filename[512]; 

或malloc的一些內存爲新的名稱(不要忘記釋放()吧...)

有與使用的幾個問題strncpy()在你的代碼中。

  • 緩衝區+5點到字符串中的第六個字符(「T」),而你說你想要反斜槓。
  • 最後一個參數是要複製的最大字節數,所以應該是msglen-13。
  • strncpy()不會終止複製的字符串,因此您需要手動執行該操作。
  • 而且,從透視readabilty, 我更喜歡

    函數strncpy(文件名,&緩衝液[4],msgLen-(9 + 4));

& buffer [5]是字符在數組中的第五個位置的地址。雖然這是個人的事情。

此外,值得指出的是,「recv」的結果可能是一個字節或512個字節。它不會只讀一行。你應該真的循環調用recv,直到你有一個完整的工作線。

+0

感謝 其實,當我!使用 strncpy(filename,&buffer [4],msgLen-(9 + 4)); filename包含「/testfile.htm H」,但是當我使用 strncpy(filename,&buffer [4],msgLen-(9 +)); 它完美地工作 再次感謝! – petsson 2009-01-07 19:35:02

+0

@petsson - 這可能是因爲你的「recv()」調用返回一個字符串與最後一個換行符序列你應該有一個更強大的檢測手段文件名的開頭和結尾。 – Roddy 2009-01-07 19:39:45

+0

是的,Roddy's和我的答案依賴於你從一個*單個*接收呼叫中輸入套接字的確切格式。 – 2009-01-07 19:42:37

5

首先你應該爲filename分配一個緩衝區。下一個問題是你的抵消。你

char buffer[512] = "GET /testfile.htm HTTP/1.0"; 
char filename[512]; // I want *filename to hold only "/testfile.htm" 

msgLen = recv(connecting_socket, buffer, 512, 0); 
strncpy(filename, buffer+4, msgLen-4-9); 
//the first parameter should be buffer+4, not 5. Indexes are zero based. 
//the second parameter is count, not the end pointer. You should subtract 
//the first 4 chars too. 

還應該確保你在字符串末尾添加一個null作爲strncpy沒有做到這一點。

filename[msgLen-4-9] = 0; 

你也可以使用memcpy代替strncpy只要你想只是複製一些字節:

memcpy(filename, buffer+4, msgLen-4-9); 
fileName[msgLen-4-9] = 0; 

在任何情況下,請務必確認您的輸入。您可能會收到來自套接字的無效輸入。

1

你的示例代碼,該行:

char* filename; 

這是一個未初始化的指針 - 它指向行不通的,而不是由任何存儲支持。您需要爲其分配一些內存,例如使用malloc()(並且記住要在完成時記下free()),或者在這種情況下,可以簡單地將其聲明爲字符數組,例如,

char filename[SOME_BUFFER_SIZE]; 

在堆棧中聲明一個數組的優點是,當你完成它時不需要明確地釋放它。

基本上,C中的數組只是隱藏指針的語法糖,因此您可以(通常)將char[]視爲char*

1

您還沒有分配給文件名

無論任何空間的東西替換文件名的聲明像

char filename[512] 

或(可能更好),留出足夠的空間用於文件名

filename = (char *)malloc(msgLen - 9 - 6 + 1); /* + 1 for the terminating null */ 
0

您尚未將任何內存空間分配給文件名。 這是一個指針......但在初始化之前,它指向一些隨機區域的內存。

您需要爲文件名分配內存。正如Roddy所說,你可以聲明文件名爲512字節。或者你可以:

filename = (char*)malloc(512*sizeof(char)); 

(注意:sizeof(char)不是嚴格需要的,但我認爲有助於明確分配的內容)。

在這個語句之後,filename是一個指向分配內存的指針,你可以自由使用它,包括從緩衝區複製數據到它。如果只複製有限的區域,請確保將文件名以null結尾。

相關問題