1

我正在使用动态内存分配和字符串。任务是提示用户输入他们将输入的字符字符串的数量(每个最多 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]);
    }
}
4

2 回答 2

1

由于 C 字符串是一个指针,因此您需要一个指向指针的指针来创建一个动态数组:

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

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

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

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

注意:不必将mallocor的结果转换为callocC。

于 2014-07-18T02:07:51.357 回答
1

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

另外,strptr是错误的类型。将其声明为 a**char而不是 just *char

于 2014-07-18T02:18:36.513 回答