[英]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.