我在C中创建了一个包含字符的向量。关键是要求用户输入键盘并让他们一次输入一个字符,然后使用calloc将其添加到向量中。它目前不加载任何内容并在任何输入后退出。我希望能够继续添加字符,直到用户输入返回代替字符然后,程序将字符转换为字符串并附加到预设的文本。之后会打印出结果。我的问题是我的程序不会将用户输入加载到矢量数组中。最终结果应该看起来像HW4输入:123456
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//declare a new vector structure
int arraySize =1;
char *vector(char *Array){
arraySize++;
void *temp=(char*) calloc(arraySize, sizeof(char));
Array= (char*) temp;
return Array;
}
int main(void){
int i, m;
int h=0;
int index=0;
char c;
char *array = (char *) calloc(arraySize, sizeof(char));
array[0] = '\0';
char ch[]= "HW4 input: ";
printf("\nEnter a single character to add to the string\n");
printf("Enter one character at a time, when done press enter without any other input.\n");
while((c=getc(stdin))!='\n'){
array[index]=c;
index++;
if(index<arraySize){
char *temp=(char*) calloc(arraySize, sizeof(char));
memcpy(temp,array, arraySize);
array=vector(array);
memcpy(array, temp, arraySize);
}
}
arraySize++;
array=vector(array);
index++;
array[index]='\0';
char output[arraySize+14];
for (i=0; i<strlen(ch); i++){
output[i]= ch[i];
}
for(m=i; m<strlen(output); m++){
output[m]=array[h];
}
printf("\n%c\n", array[0]);
free(array);
return 0;
}
答案 0 :(得分:0)
在您编写的代码中
index++;
if (index<arraySize) {
...
但是在启动时arraySize == 1这样条件永远不会成立。
分配内存是一项代价高昂的操作,因此分配每个字节然后复制内容是无效的。
而是分配说100个字符然后如果用户输入更长则添加另外100个字符。最方便的方法是使用realloc。
e.g。
if (index < arraySize)
{
char* tmp = realloc(array, arraySize + 100)
if (tmp != NULL)
{
array = tmp;
arraySize += 100;
}
else
{
fprintf(stderr, "out of memory");
exit(EXIT_FAILURE);
}
}
一旦用户完成输入以获得正确的缓冲区大小,您就可以使用正确的大小再次重新分配。