我有一個字符串指針像下面,複製從指針數組一些C字符串++
char *str = "This is cool stuff";
現在,我已經引用到這個字符串的指針像下面,
char* start = str + 1;
char* end = str + 6;
所以,start
和end
指向*str
的不同位置。我怎樣才能將開始和結束之間的字符串字符複製到一個新的字符串指針。任何現有的C++/C函數都是可取的。
我有一個字符串指針像下面,複製從指針數組一些C字符串++
char *str = "This is cool stuff";
現在,我已經引用到這個字符串的指針像下面,
char* start = str + 1;
char* end = str + 6;
所以,start
和end
指向*str
的不同位置。我怎樣才能將開始和結束之間的字符串字符複製到一個新的字符串指針。任何現有的C++/C函數都是可取的。
只需創建一個新的緩衝稱爲蒸餾水和使用strncpy()函數
char dest[end-start+1];
strncpy(dest,start,end-start);
dest[end-start] = '\0'
爲什麼選擇Kaboom? 256有什麼魔力? – jmucchiello 2009-11-05 13:19:04
以前它是「dest [256]」 – foraidt 2009-11-05 13:20:37
請記住,如果在'start'和'end'之間有'\ 0'字符,複製將在那裏停止。 – ndim 2009-11-05 13:43:01
char newChar[] = new char[end-start+1]]
p = newChar;
while (start < end)
*p++ = *start++;
您的字符串名稱有一個保留字,並且沒有刪除[]。 – 2009-11-05 13:25:41
與Arkaitz Jimenez的解決方案相比,有點複雜。 另外,是不是'新'一個不能用作變量名稱的受保護關鍵字?不對VC9進行協同處理。 – foraidt 2009-11-05 13:26:04
@Sid,如果你刪除它,那麼你不再有字符串。 – 2009-11-05 13:32:42
這是最好的strcpy()
要做到這一點,並終止自己的結果。標準strncpy()
函數具有非常奇怪的語義。
如果你真的想要一個「新的字符串的指針」,並有點安全方面的長度和靜態緩衝區,你需要動態分配新的字符串:
char * ranged_copy(const char *start, const char *end)
{
char *s;
s = malloc(end - start + 1);
memcpy(s, start, end - start);
s[end - start] = 0;
return s;
}
如果你想這樣做與C++ STL:
#include <string>
...
std::string cppStr (str, 1, 6); // copy substring range from 1st to 6th character of *str
const char *newStr = cppStr.c_str(); // make new char* from substring
使用STL std::string
:
#include
const char *str = "This is cool stuff";
std::string part(str + 1, str + 6);
此用途迭代器範圍構造函數,所以C字符串的部分不必以零終止。
這是功能strncpy
可以使用的罕見情況之一。只需計算您需要複製的字符數並在strncpy
中指定確切的金額即可。請記住,在這種情況下,strncpy
不會零終止結果,因此您必須自己執行此操作(順便說一下,這意味着使用memcpy
而非幾乎無用的strncpy
更合理)。
而且請你自己幫忙,開始用const char *
指針和字符串文字。
假設end
遵循指向剛剛過去最後一項要複製的慣用語義(STL語義是一個有用的慣用法,即使我們正在處理直C),並且您的目標緩衝區已知有足夠的空間:
memcpy(buf, start, end-start);
buf[end-start] = '\0';
我在子字符串函數也採取了目標緩衝區的大小作爲參數,因此它可以進行檢查,並截斷結果或返回一個錯誤,以防止超支這個包起來。
我會避免使用strncpy()
,因爲太多的程序員會忘記它可能不會終止目標字符串的事實,所以第二行可能會被某些人認爲是不必要的,從而被錯誤地放棄。如果使用memcpy()
,那麼可能性較小。(一般來說,只是拒絕使用strncpy()
)
這是'c',而不是'C++',在'C++'中,可以使用字符串類或數組類(I HOPE)。 – 2009-11-05 13:18:09