1

したがって、このプログラムは、入力した数に応じてアスタリスクの数を出力する必要があるため、5 を入力すると、5 つのアスタリスクが出力されます。

どこが間違っているのかわかりませんか?また、誰かがCの良い本を推薦できるなら、私は学校のテキストとダミーのCを読んでいますが、私はそれを理解していません.


    void barplot(int num1, char array[]);

int main()
{
    int n1;
    printf("Enter a number: ");
    scanf("%d",&n1);
    printf("You have entered: %d\n",n1);

    char astrk[n1];
    strcpy(astrk, "*");

    barplot(n1, astrk);
    return(0);

}

void barplot(int num1, char array[])
{
    printf("num1=%d\n",num1);
    int i=0;


    for(i=0; i<num1; i++)
    {
        printf("%c",array[i]);
    }
}

編集:割り当てごとに配列が必要です

4

5 に答える 5

2

配列の使用に行き詰まっている場合は、次を使用してastrk配列に'*'文字を入力できmemsetます。

char astrk[n1];
memset(astrk, '*', n1);

barplot(n1, astrk);
return 0;

memset配列 (最初の引数) に文字 (2 番目の引数) のコピーを、3 番目の引数の長さまで入れます。これは配列を null で終了しないため、直接指定できないことに注意してくださいprintf

それができるようにしたい場合はprintf、次のように、null ターミネータに十分なスペースを割り当てる必要があります。

char astrk[n1+1];
memset(astrk, '*', n1);
astrk[n1] = '\0'

printf("%s", astrk);
return 0;

barplotその後、関数はまったく必要ありません。

于 2012-10-14T08:46:31.780 に答える
1

char1 つの文字を格納するためだけに、配列全体を実際に必要とするわけではありません。char[]を単一の に置き換えてみましょうchar:

void barplot(int num1, char array);

int main()
{
    int n1;
    printf("Enter a number: ");
    scanf("%d", &n1);
    printf("You have entered: %d\n", n1);

    barplot(n1, '*');
    return 0;
}

void barplot(int num1, char ch)
{
    printf("num1=%d\n",num1);
    int i;

    for(i=0; i<num1; i++)
    {
        putchar(ch);
    }
}
于 2012-10-14T08:32:27.040 に答える
0

標準 c では可変長配列が許可されていないことがなぜ言及されていないのだろうか。C99 (ISO/IEC 9899:1999) で可変長配列を実行できますが、それらは C++ または標準 C の一部ではありません。一部のコンパイラでサポートされている可能性がありますが、常にリスクがあります。

さらに、上記の質問は割り当てであり、実行時に決定されるサイズはmallocなどの動的割り当てを使用して処理する必要があるという意図で与えられたと確信しています。

char arr[SIZE]; // size has to be a constant value or a variable with const modifier

上記の構文では、実行時にサイズを決定することはできません。

標準的な方法として malloc を使用する必要があります

char *arr = malloc(n1);

これも後で解放する必要があります

free(arr);
于 2012-10-14T09:28:24.900 に答える
0

astrk配列にアスタリスクを入力していません。アスタリスクが 1 つしかない文字列リテラルをコピーしました。

これらのアスタリスクを印刷するだけでよいのに、なぜ配列が必要なのですか?

これを試して:

void barplot(int num1)
{
    printf("num1=%d\n",num1);

    for(i=0; i<num1; i++)
    {
        printf("*");
    }
    printf("\n");
}
于 2012-10-14T08:32:41.240 に答える
0
void barplot(int num1)
{
  char s[BUFSIZ];
  memset(s,'*',BUFSIZ);
  printf("%.*s",num1%BUFSIZ,s);
}
于 2012-10-14T08:43:31.030 に答える