#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char *names = NULL;
int capacity = 0;
int size = 0;
printf("Type 'end' if you want to stop inputting names\n");
while (1) {
char name[100];
printf("Input:\n");
fgets(name, sizeof(name), stdin);
if (strncmp(name, "end", 3) == 0) {
break;
}
if (size == capacity) {
char *temp = realloc(names, sizeof(char) * (size + 1));
if (!temp) {
if (names) {
return 1;
}
}
names = temp;
capacity++;
}
names[size] = name;
size++;
}
for (int i = 0; i < size; i++) {
printf("OUTPUT :%c\n", names[i]);
}
if (names) {
free(names);
}
}
我正在尝试在C中创建一个动态长度数组,但是我不知道我的代码有什么问题?我认为这是我如何接受用户输入的原因,并且在执行代码names[size] = name
时出现了问题。
答案 0 :(得分:2)
您需要声明一个指向字符串(char **)的指针数组,而不是指向单个字符串(char *)的指针。
这意味着当您要添加新条目时,不仅需要为数组中的新指针(类型为@Directive({
selector: `input[matInput], textarea[matInput], select[matNativeControl],
input[matNativeControl], textarea[matNativeControl]`,
...
providers: [{provide: MatFormFieldControl, useExisting: MatInput}],
})
而不是char*
)留出空间,而且还必须分别为字符串本身分配存储空间,然后将刚刚为其留出空间的指针设置为该已分配字符串。
答案 1 :(得分:0)
代码中存在多个问题:
names
应该定义为指向char *
:char **names = NULL;
fgets()
读取字符串的副本,否则names
中的所有条目将指向相同的数组name
。capacity
和size
。"OUTPUT :%c\n"
的格式不适用于字符串。这是更正的版本:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char **names = NULL;
int capacity = 0;
int size = 0;
printf("Type 'end' if you want to stop inputting names\n");
for (;;) {
char name[100];
printf("Input:\n");
if (!fgets(name, sizeof(name), stdin)) {
break;
}
if (strncmp(name, "end", 3) == 0) {
break;
}
if (size == capacity) {
// reallocate array with geometric growth
int new_capacity = capacity + (capacity / 2) + 4;
char *temp = realloc(names, sizeof(*names) * new_capacity);
if (!temp) {
free(names);
printf("out of memory\n");
return 1;
}
names = temp;
capacity = new_capacity;
}
name[strcspn(name, "\n")] = '\0'; // strip the trailing newline if any
names[size++] = strdup(name); // allocate a copy of the string
}
for (int i = 0; i < size; i++) {
printf("OUTPUT: %s\n", names[i]);
}
free(names);
return 0;
}