我正在使用动态内存分配和字符串。赋值是提示用户输入的字符串数量(每个最多80个字符),然后有一个函数获取字符串,另一个函数打印字符串和字符数。
我使用指针数组从函数中获取数据。一切都很好,我准备提交作业,直到我重新阅读问题,并看到指针数组也必须动态分配。我得到了它的工作,但现在i = 0
,puts(strptr1[i]);
只是给了我胡言乱语(ɶ?)。与此同时,i = 1
及以上都很好。
谢谢,这是我的代码。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void inputStrings(char *strptr1[], int n);
void outputStrings(char *strptr1[], int n);
int main()
{
int n = 0;
char *strptr = 0;
printf("This program uses dynamic storage to manipulate character strings. Fun!");
printf("\n\nHow many strings will you enter? ");
scanf("%d", &n);
fseek(stdin,0,SEEK_END); // Clear input buffer
// char *strptr[n];
strptr = (char *) calloc(n, sizeof(char));
inputStrings(strptr, n);
outputStrings(strptr, n);
return 0;
}
void inputStrings(char *strptr1[], int n) // Prompt for input and copy into dynamic memory
{
const int STRLNG = 80;
int i = 0;
char strname[STRLNG];
printf("Input strings:\n");
for (i = 0; i < n; i++)
{
gets(strname);
strptr1[i] = (char *) malloc(strlen(strname+1));
strcpy(strptr1[i], strname);
}
}
void outputStrings(char *strptr1[], int n) // Determine length and print length and string
{
int i = 0;
printf("\nChar | String\n");
for (i = 0; i < n; i++)
{
printf(" %2d | ", strlen(strptr1[i]));
puts(strptr1[i]);
}
}
答案 0 :(得分:1)
由于C字符串是指针,因此需要指向指针的指针来生成动态数组:
char **strptr;
...
strptr = calloc(n, sizeof(char*));
这将为动态字符串数组分配足够的内存。
不要忘记释放已分配的所有内存!这包括字符串数组和字符串本身:
for (i = 0; i < n; i++) {
free(strptr[i]);
}
free(strptr);
注意:没有必要在C中投射malloc
或calloc
的结果。
答案 1 :(得分:1)
因为用户在输入字符串数后按下回车键,新行将添加到输入缓冲区。在for循环之前添加getchar();
以输入字符串。
此外,strptr
的类型错误。将其声明为**char
,而不只是*char
。