簡體   English   中英

從另一個字符串創建一個字符串,在 C 中的每第 n 個字符后插入一個字符

[英]Create a string from another string with a character inserted after every nth character in C

我有一個字符串:

012345678901234567890

我希望它分成 7 個塊,如下所示:

0123456-7890123-4567890

我寫了這段代碼:

    strcpy(input,"01");
    strcat(input,"2345678901234567890");
    printf("input is %s\n",input);

    char *output = malloc(22 * sizeof(char));
    int i = 0;
    for (char* c = input; *c != '\0'; c++) {
        output[i] = *c;
        if (i > 0 && (i % 7 == 0)) {
            i++;
            output[i] = '-';

        }
        i++;
    }
    output[i] = '\0';
    printf("output is %s\n",output);

output 是這樣的:

input is 012345678901234567890
output is 01234567-890123-456789-0

由於指針是從零開始計數的,所以問題變得復雜了。 我的指針邏輯錯誤在哪里? 如何使代碼適用於任意數量的 septets?

編輯

這是我的解決方案。 有沒有更清潔的方法?

    char *input = (char*) malloc(22 * sizeof(char*));
    strcpy(input,"01");
    strcat(input,"2345678901234567890");
    printf("input is %s\n",input);

    int i = 0;
    int j = 0;
    char *output = malloc(22 * sizeof(char));
    for (char* c = input; *c != '\0'; c++) {
        output[i] = *c;
        j++;
        if (j % 7 == 0 && i <22) {

            i++;
            output[i] = '-';

            j = 0;
        }
        i++;
    }

一方面,您沒有為 output 分配足夠的output 您需要為 21 個字符分配空間以從input復制字符,+ 2 用於插入的新破折號,+ 1 用於 null 終止符。 這需要 24 個字符,但您只分配了 22 個字符的空間。

此外,您將一個變量i用於兩個不同的目的 - 索引到input和索引到output 插入破折號會將索引偏移到output ,這是您的代碼的根本問題。 因此,您需要改用兩個單獨的變量。

嘗試這個:

char *input = malloc(22 * sizeof(char*));
strcpy(input, "01");
strcat(input, "2345678901234567890");
printf("input is %s\n", input);

int input_len = strlen(input);

char *output = malloc((input_len + ((input_len - 1) / 7) + 1) * sizeof(char));
int j = 0;
for (int i = 0; i < input_len; ++i) {
    if (i > 0 && i % 7 == 0) {
        output[j++] = '-';
    }
    output[j++] = input[i];
}
output[j] = '\0';
printf("output is %s\n", output);

在線演示

暫無
暫無

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

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