[英]change string in c with only pointer
有一個指向字符串的指針,可以說:char * p =“ abcdef”我想刪除一些字符。
讓我們說第二個字符,所以我想獲得* p =“ ace”我的算法是這樣的:
int i=1,j=1
for(;p != '\0';p++,i++)
if (i % 2 ==0)
*(p - j++)= *p
*(p-j)='\0'
該算法當然可以找到每一秒鍾的字符,但是無論我如何嘗試編寫“刪除”過程,是否存在編譯錯誤或字符串未更改,都無關緊要。
我開始相信,沒有任何malloc幫助就無法解決該問題。 同樣,我需要在O(n)上執行此操作,而無需任何其他STRINGS數組。
p != '\\0'
應該是*p != '\\0'
(或*p != 0
或*p
)。 i
應該初始化為0
。 (您記錯了。) j
應該初始化為0
。 (因一個錯誤而關閉。) p
j
需要增加。 如果避免相對於不相關指針的偏移量,您的代碼將更具可讀性,而不那么脆弱。
void filter_inplace(char* src) {
char* dst = src;
for (size_t i=0; src[i]; ++i) {
if (i % 2 == 0)
*(dst++) = src[i];
}
*dst = 0;
}
選擇:
void filter_inplace(char* src) {
char* dst = src;
while (1) {
if (!*src) break;
*(dst++) = *(src++);
if (!*src) break;
src++;
}
*dst = 0;
}
當然,您不能執行以下操作,因為p
指向只讀內存:
char* p = "abcdef"; # XXX Should be "const char*".
filter_inplace(p); # XXX Overwrites read-only memory.
您可以執行以下操作:
char p[] = "abcdef";
filter_inplace(p);
您可以執行以下操作:
char* p = strdup("abcdef");
filter_inplace(p);
free(p);
我開始相信,沒有任何malloc幫助就無法解決該問題。 同樣,我需要在O(n)上執行此操作,而無需任何其他STRINGS數組。
有點像。 至少沒有其他字符串是無法做到的。 即使您使用malloc
(或strdup
)來獲取內存,我仍然會認為它是另一個字符串。
所以只要您像這樣初始化char指針:
char *p = "abcdef";
這是不可能的 。 您不能更改字符串"abcdef"
中的任何字符。
如果以上代碼更改為
char p[] = "abcdef";
您將能夠做自己想做的事情。 但是,即使同時具有初始化程序字符串和char數組,也可以將其視為使用其他字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.