簡體   English   中英

嘗試連接字符串會產生分段錯誤

[英]Attempting to concatenate strings produces a segmentation fault

我正在嘗試將命令行參數轉換為單個char*或“ c-string”引用,但是似乎我的代碼壞了。 沒有任何編譯器警告,所以我現在有點卡住了

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

int main(int argc, char** argv) {
    if (argc < 2) {
        printf("usage: program <arguments>");
        return 0;
    }
    char* string = "";
    for (int i = 1; i < argc; i++) {
        strcat(string, argv[i]);
    }
    printf("%s", string);
    printf("\n");
    return 0;
}

編譯:

gcc program.c -Wall -std=c99 -o prog

似乎沒有發出任何警告,那么我哪里可能出錯了?

編輯:

更新代碼至此:

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

int main(int argc, char** argv) {
    if (argc == 0) {
        printf("usage: program <arguments>");
        return 1;
    }
    int tot = 0;
    for (int i = 1; i < argc; i++) {
        tot += strlen(argv[i]);
    }
    char string[tot + argc]; // total word length
    strcat(string, "\0");
    for (int i = 1; i < argc; i++) {
        strcat(string, argv[i]);
        strcat(string, " ");
    }
    strcat(string, "\0");
    printf("%s", string);
    printf("\n");
    return 0;
}

但是,出現了一個新問題,因為它似乎在字符串之前添加了偽隨機垃圾字符。 我將其添加到串聯循環中以查看輸出:

for (int w = 0; w < sizeof(argv[i]); w++) {
    printf("\t%s%c\n", "char value: ", argv[i][w]);
}

這是輸出:

./prog one two three
    char value: o
    char value: n
    char value: e
    char value:
    char value: t
    char value: w
    char value: o
    char value:
    char value: t
    char value: h
    char value: r
    char value: e
Tëñ¿one two three

因此,我的猜測是問題在於參數中沒有\\0值,而沒有100%確定如何進行。 是否將創建一個新的char數組以附加到該數組,然后添加適當的char

您需要先計算總空間:

for (int i = 1; i < argc; i++) {
    total += strlen(argv[i]);
}

然后為最終字符串分配空間:

string = calloc(1, total+1);

+1表示空終止符('\\ 0')。
然后,您可以strcat轉換為字符串,並在不再需要時記住釋放它。

這是完整的工作代碼(不檢查錯誤):

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

int main(int argc, char** argv) {
    int total = 0;
    int i;

    if (argc < 2) {
        printf("usage: program <arguments>");
        return 0;
    }
    char *string;
    for (i = 1; i < argc; i++) {
            total += strlen(argv[i]);
    }
    string = calloc(1, total+1);
    for (i = 1; i < argc; i++) {
            strcat(string, argv[i]);
    }   
    printf("%s", string);
    printf("\n");

    free(string);

    return 0;
}

您聲明string的方式使該string指向的內存無法修改。

相反,如果知道所需的最大大小,則可以將string聲明為char數組。 而且您最好進行長度檢查以確保在執行strcat時不會溢出

char string[1024]; // put the size you needed 

或者,您可以動態分配空間。 如@moeCake所建議。

您正在嘗試寫入文字字符串。 兩個問題:1)文字字符串通常不放在可寫內存中。 2)字符串(字符數組)的大小為零; 沒有寫空間。

快速的答案是在堆上分配一個緩沖區:

char* string = (char*)malloc(256);

或在堆棧上:

char string[256];

理想情況下,您避免選擇256這樣的恆定大小。一種方法是在argv上循環兩次-一次測量所需的空間,然后再次執行復制。

暫無
暫無

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

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