簡體   English   中英

為什么 strcat 不適用於 C 中的指針?

[英]Why strcat doesn't work with pointer in C?

當我使用普通數組執行此操作時,它正在工作,但使用指針卻沒有。

#include <stdio.h>
#include <string.h>
int main()
{
    char source[]="Agdhefhe";
    char *accum = "";
    for(int i=0;i<=sizeof(*source)/sizeof(char);i++)
        {
            for(int j=0; j<i; j++)
            strcat(accum,source);
        }
        
    printf("%s",accum);
    return 0;
}

指針accum指向長度為 1 的const初始化器。寫入 const 和超出分配空間的結果是未定義的。

accum必須指向一個可寫區域,並分配了足夠的空間來容納最終的字符串。

為了讓它正確,您需要為目標分配足夠的空間來寫入。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    char source[] = "Agdhefhe";
    size_t sz = 360;
    char *accum = (char *) malloc(sz + 1);
    *accum = '\0';  // needed for first strcat call
    for (int i = 0; i <= sizeof(*source) / sizeof(char); i++)
        for (int j = 0; j < i; j++)
            strncat(accum, source, sz);  // strncat used to not write too much

    printf("%s", accum);
    free(accum);
    return 0;
}

該程序編寫Agdhefhe但可以簡化為

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    char const source[] = "Agdhefhe";
    size_t sz = 360;
    char *accum = (char *) malloc(sz + 1);
    *accum = '\0';  // needed for first strcat call
    strncat(accum, source, sz);

    printf("%s", accum);
    free(accum);
    return 0;
}

但是,如果您想多次復制字符串,請編寫:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
    char const source[] = "Agdhefhe";
    size_t sz = 360;
    char *accum = (char *) malloc(sz + 1);
    *accum = '\0';  // needed for first strcat call
    for (int i = 0; i <= sizeof(source) / sizeof(char); i++)  // the change is here
        for (int j = 0; j < i; j++)
            strncat(accum, source, sz);

    printf("%s", accum);
    free(accum);
    return 0;
}

這將寫入AgdhefheAgdhefheAgdhefheAgdhefhe...Agdhefhe (360 個字符)。

暫無
暫無

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

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