1

私は動的メモリ割り当てと文字列を扱っています。割り当ては、入力する char 文字列の数 (それぞれ最大 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]);
    }
}
4

2 に答える 2

1

ユーザーが文字列の数を入力した後にエンターを押すため、改行が入力バッファーに追加されます。getchar();文字列を入力する for ループの前に 追加します。

また、strptr間違ったタイプです。**charだけではなくとして宣言し*charます。

于 2014-07-18T02:18:36.513 に答える
1

C 文字列はポインターであるため、動的配列を作成するにはポインターへのポインターが必要です。

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

これにより、文字列の動的配列に十分なメモリが割り当てられます。

割り当てたすべてのメモリを解放することを忘れないでください! これには、文字列の配列と文字列自体の両方が含まれます。

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

malloc注:またはの結果をcallocCでキャストする必要はありません。

于 2014-07-18T02:07:51.357 に答える