[英]Combining Strings into a List in C
以下是我的以下問題的代碼。 我正在嘗試使用逗號分隔的一串名字和姓氏字符串,並將它們轉換為全名列表。 例如,如果firstnames = "John,Jane"
和lastnames = "Smith,Doe"
,則輸出應為["John Smith", "Jane Doe"]
。
我相信我的問題出現在我使用strtok
因為first_names[i] = name
給了我一個錯誤。 任何有關這方面的幫助將非常感謝!
char **combine_names(char *firstnames, char *lastnames) {
char first_names[50][50];
char last_names[50][50];
int i = 0;
char *name = strtok(firstnames, ",");
while (name != NULL) {
first_names[i] = name;
i++;
name = strtok(NULL, ",");
}
i = 0;
name = strtok(lastnames, ",");
while (name != NULL) {
last_names[i] = name;
i++;
name = strtok(NULL, ",");
}
char **names;
names = malloc(strlen(first_names) * sizeof(char*));
for (int i = 0; i < strlen(first_names); i++) {
names[i] = malloc(51 * sizeof(char));
}
int i = 0;
int j = 0;
int k = 0;
while (first_names[i] != '\0') {
while (first_names[i][j] != '\0') {
names[i][j] = first_names[i][j];
j++;
}
names[i][j] = ' ';
j++;
while (second_names[i][k] != '\0') {
names[i][j] = second_names[i][k];
j++;
k++;
}
names[i][j] = '\0';
i++;
}
names[i] = '\0';
return names;
}
以下行導致第一個參數出現不兼容的指針錯誤。 這是為什么?
names = malloc(strlen(first_names) * sizeof(char*));
使用strtok()
確實會帶來一些問題,但主要問題是你使用無效的表達式malloc(strlen(first_names) * sizeof(char*));
分配names
malloc(strlen(first_names) * sizeof(char*));
。 first_names
不是C字符串, strlen(first_names)
不計算first_names
數組中的條目數。
這是一種更簡單,更安全的方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **combine_names(const char *firstnames, const char *lastnames) {
int n = 0;
char **names = malloc(sizeof(*names) * (n + 1));
char *p;
if (names == NULL) {
perror("cannot allocate memory\n");
}
while (*firstnames && *lastnames) {
int len1 = strcspn(firstnames, ",");
int len2 = strcspn(lastnames, ",");
int size = len1 + 1 + len2 + 1;
p = malloc(size);
if (p == NULL) {
perror("cannot allocate memory\n");
}
snprintf(p, size, "%.*s%s%.*s",
len1, firstnames,
len1 && len2 ? " " : "",
len2, lastnames);
names = realloc(names, sizeof(*names) * (n + 2));
if (names == NULL) {
perror("cannot allocate memory\n");
}
names[n++] = p;
firstnames += len1 + (firstnames[len1] == ',');
lastnames += len2 + (lastnames[len2] == ',');
}
names[n] = NULL;
return names;
}
請記住, first_names
是一個雙字符數組。 這意味着first_names[i]
實際上是一個字符串或一個字符數組。 您不能直接分配給字符數組,而是必須逐個字符地寫入數組。 最簡單的方法是使用字符串復制或strcpy(first_names[i], name)
,但strcpy不能防止緩沖區溢出。 一種方法是使用strncpy
,只是要小心,因為當源字符串超過目標字符串的大小時,這不能保證字符串以空值終止。 要解決此問題,請使用
strncpy(first_names[i], name, 50);
first_names[i][49] = '\0';
考慮到strncpy
的缺點,最好使用類似於@chqrlie的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.