簡體   English   中英

指針字符串

[英]pointers strings

復制到正確的位置,但在達​​到計數后不會停止。 我認為我的代碼應該如下工作

char har *orig, int start, int count, char *final);

int main(void)
{
    const char source[] = "one two three";
    char result[] = "123456789012345678";

    printf("%s\n",GetSubstring(source, 4, 3, result));

    return 0;
}

char r *orig, int start, int count, char *final)
{    
    char *temp = (char *)orig;

    final = temp;


   }

    for ( ; *temp && (count > 0) ; count--)
    {
    rn final;
}
  1. 第一個for循環不會檢查temp數組是否存在(如何以某種方式不詢問內存管理器而檢查已分配內存的存在?!)。 temp僅僅是一個指針。 您要檢查的是orig字符串的第一個start字節內沒有零。 沒關系,也許就是您所說的“存在”。

  2. 您的意圖是從orig復制到final ,但是將final重設到orig 那就是你的錯誤所在。 您必須刪除該行,它才能解決問題。

  3. 您不需要創建temp指針,可以使用orig指針。 您可以隨意修改它-記住,函數參數實際上是局部變量。 C語言中的函數參數是按值傳遞,您可以通過將指針(值!)傳遞給數據來實現按引用傳遞。

我應該補充一點,這個功能的前提有些破損。 它“有效”,但是這不是人們可能期望的。 值得注意的是:

  1. 沒有跡象表明源字符串比start短。

  2. 沒有跡象表明源字符串比start + count短。

    也許這些還可以,但是在那些情況可能是錯誤的情況下,該功能的用戶應該有可能對此進行指示。 呼叫者會知道預期的是什么,而不是預期的,因此, 僅當您向呼叫者提供一些反饋時,呼叫者才能確定。

  3. 您要返回的位置是輸出末尾的1位置,即零終止點之后的位置。 那不是很方便。 如果要使用返回的值連接后繼字符串,則必須先減一。

下面是帶有合理命名的變量的固定代碼。

char *GetSub(const char *src, int start, int count, char *dst)
{
    for ( ; *src && (start > 0) ; start--)
    {
        src++; /* Note: *src++ works too, but is pointless */
    }

    for ( ; *src && (count > 0) ; count--)
    {
        *dst++ = *src++;
    }

    *dst++ = 0;
    return dst; /* Notice: This returns a pointer to the end of the
                memory block you just wrote. Is this intentional? */
}

您編寫的內容存在幾個問題。 讓我們列舉一下:

  1. char *temp = (char *)orig; -您正在將const char * (您保證不會修改)分配給char * (您違反了該承諾)。 做錯了事。

  2. final = temp 不,這根本不會改變原始的 final (呼叫者持有的副本)。 它什么也沒做 它會將 (函數的) final副本更改為指向temp所指向的同一位置。

  3. *temp++; -如果您不打算使用它,則沒有必要取消引用。 當然,增加它是正確的[請參見下面帶有KubaOber的注釋線程]。

  4. final++ = *temp++; -這真讓人困惑。

  5. *final++ = 0; return final; -您將final地址的值設置為“ 0”。 然后您將其遞增(以指向空間中的某個位置,也許指向黑洞)。 然后返回該指針。 這也是錯誤的。

真正應該做的是以方便的方式包裝strncpy

但是,如果您堅持要編寫自己的代碼,則可能希望您的函數像以下這樣簡單:

char *GetSub(const char *orig, int start, int count, char *final)
{    
  int i;

  for (i = 0; i < count; i++)
    {
      final[i] = orig[i+start];

      if (final[i] == '\0')
        break;
    }
  final[i] = '\0';

  return final; /* Yes, we just return what we got.  */
}

問題在於以下行:

final = temp;

刪除它,問題應該得到解決。

char *a="abcdefgh";

我想將字符串“ cde”復制到另一個。

我得到的索引是3(開始)。

char *temp=malloc(3*sizeof(char))
strncpy(temp,a+3,3);

這是您需要的嗎?

更改您的GetSub函數:

char *GetSub(const char *orig, int start, int count, char *final)
{
    char *temp = (char *)orig;

    // with original final = temp and final++ you loose final valid pointer
    char *final2 = final;


    for ( ; *temp && (start > 0) ; )
    {
        start--;

        // you don't need to dereference temp
        temp++;
    }

    for ( ; *temp && (count > 0) ; count--)
    {
        *final2++ = *temp++;
    }

    *final2 = 0;

    // return a valid pointer
    return final;
}

您的代碼有一些錯誤:

char *GetSub(const char *orig, int start, int count, char *final)
{
    char *temp = (char *)orig;

    //final = temp; /* Why this? */

    for ( ; *temp && (start > 0) ; )
    {
        start--;
        temp++; /* Instead of *temp++ */
    }

    for ( ; *temp && (count > 0) ; count--)
    {
        *final++ = *temp++;
    }

    *(final+count) = '\0';
    return final;
}

希望能有所幫助。

暫無
暫無

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

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