从动态分配的指针数组打印时出错

时间:2014-07-18 02:02:29

标签: c string pointers dynamic puts

我正在使用动态内存分配和字符串。赋值是提示用户输入的字符串数量(每个最多80个字符),然后有一个函数获取字符串,另一个函数打印字符串和字符数。

我使用指针数组从函数中获取数据。一切都很好,我准备提交作业,直到我重新阅读问题,并看到指针数组也必须动态分配。我得到了它的工作,但现在i = 0puts(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]);
    }
}

2 个答案:

答案 0 :(得分:1)

由于C字符串是指针,因此需要指向指针的指针来生成动态数组:

char **strptr;
...
strptr = calloc(n, sizeof(char*));

这将为动态字符串数组分配足够的内存。

不要忘记释放已分配的所有内存!这包括字符串数组和字符串本身:

for (i = 0; i < n; i++) {
    free(strptr[i]);
}
free(strptr);

注意:没有必要在C中投射malloccalloc的结果。

答案 1 :(得分:1)

因为用户在输入字符串数后按下回车键,新行将添加到输入缓冲区。在for循环之前添加getchar();以输入字符串。

此外,strptr的类型错误。将其声明为**char,而不只是*char