簡體   English   中英

使用strcat的分段錯誤

[英]Segmentation fault using strcat

這是我的代碼:

char *name, name_log="log-";

------從用戶那里獲取“名稱”-

strcat(name_log, name);
char ext[] = ".log";
strcat(name_log, ext);

我需要結束的是name_log =“ log-'name'.log”,但是我遇到了分段錯誤錯誤:((。我做錯了,如何解決?Thx

字符串文字被分配了固定數量的內存,通常在只讀部分中,您需要使用緩沖區。

char buffer[64] = "log-";
strncat(buffer,".log",32);

附帶一提, strcat通常是不安全的,您需要使用一些檢查其使用的緩沖區大小或對其進行限制的緩沖區之類的東西,例如strncat

首先,如果是您的代碼:

char *name, name_log="log-";

那么name_log是一個char,而不是char指針。

假設這是一個錯字,則不能將其附加到字符串文字上。 字符串文字的修改是未定義的行為。

對於一個大小可變的字符串(如user看來),可能最安全的選擇是分配另一個足以容納結果的字符串,例如:

char *name, *name_log = "log-", *ext = ".log";
// Do something to allocate and populate name
char *buffer = malloc (strlen (name_log) + strlen (name) + strlen (ext) + 1);
if (buffer == NULL) {
    // Out of memory.
} else {
    strcpy (buffer, name_log);
    strcat (buffer, name);
    strcat (buffer, ext);
    // Do something with buffer.
    free (buffer);
}

malloc確保您有足夠的空間安全地執行所有字符串操作,三個組件的足夠字符以及空終止符。

完全不同的解決方案是:

const char *prefix = "log-";
const char *suffix = ".log";
// There's a "char *name" somewhere
int size_needed;
char *result;

size_needed = snprintf(NULL, 0, "%s%s%s", prefix, name, suffix);
result = malloc(size_needed + 1);
snprintf(result, size_needed + 1, "%s%s%s", prefix, name, suffix);

// "result" now contains the desired string.

snprintf是,如果有足夠的空間,它將返回要寫入的字符數。 可以通過預先測量要分配的內存量來使用它,從而不必進行復雜且容易出錯的計算。

如果您恰巧在使用asprintf的系統上,則更加簡單:

char *result = NULL /* in case asprintf fails */;
asprintf(&result, "log-%s.log", name);
// "result" must be released with "free"

您需要分配內存。 您不能以這種方式添加到字符串,因為添加的字符串將進入尚未分配的內存。

你可以做

char[20] strarray;

strcat(strarray, "log-");
strcat(strarray, "abcd");

name_log指向靜態位置:“ log-”,這意味着無法修改,而作為strcat()的第一個參數,它必須是可修改的。

嘗試將name_log的類型char*更改為char[] ,例如

char[20] name_log = "log-";

暫無
暫無

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

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