簡體   English   中英

僅使用指針更改c中的字符串

[英]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.

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