根据用户在C中输入的数字,使用数组打印出一些星号

根据用户在C中输入的数字,使用数组打印出一些星号,c,arrays,function,C,Arrays,Function,因此,这个程序应该根据您输入的数字打印出星号的数量,因此,如果您输入5,将打印出5个星号 我不知道我哪里出错了?另外,如果有人能推荐一本好书给C,我读了我的学校课本,C是给傻瓜的,我就是不明白 void条形图(int num1,char数组[]); int main() { int-n1; printf(“输入一个数字:”); scanf(“%d”&n1); printf(“您已输入:%d\n”,n1); char-astrk[n1]; strcpy(astrk,“*”); 条形图(n1,as

因此,这个程序应该根据您输入的数字打印出星号的数量,因此,如果您输入5,将打印出5个星号

我不知道我哪里出错了?另外,如果有人能推荐一本好书给C,我读了我的学校课本,C是给傻瓜的,我就是不明白


void条形图(int num1,char数组[]);
int main()
{
int-n1;
printf(“输入一个数字:”);
scanf(“%d”&n1);
printf(“您已输入:%d\n”,n1);
char-astrk[n1];
strcpy(astrk,“*”);
条形图(n1,astrk);
返回(0);
}
无效条形图(整数num1,字符数组[])
{
printf(“num1=%d\n”,num1);
int i=0;

对于(i=0;i您不需要一个完整的
char
数组来存储一个字符。让我们用一个
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);
    }
}
void条形图(int num1,字符数组);
int main()
{
int-n1;
printf(“输入一个数字:”);
scanf(“%d”&n1);
printf(“您已输入:%d\n”,n1);
条形图(n1,“*”);
返回0;
}
无效条形图(整数m1,字符ch)
{
printf(“num1=%d\n”,num1);
int i;

对于(i=0;i您没有用星号填充
astrk
数组。您只是复制了一个只有一个星号的字符串文本

如果你只需要打印这些星号,为什么你需要一个数组呢

试试这个:

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

    for(i=0; i<num1; i++)
    {
        printf("*");
    }
    printf("\n");
}
void条形图(int num1)
{
printf(“num1=%d\n”,num1);

对于(i=0;i假设您无法使用数组,您可以使用
memset
astrk
数组填充为
'*'
字符:

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

barplot(n1, astrk);
return 0;
memset
使用字符副本(第二个参数)填充数组(第一个参数),最大长度为第三个参数中的长度。请注意,这不会为null终止数组,因此不能直接
printf

如果您确实希望能够
printf
it,那么应该为空终止符分配足够的空间,如下所示:

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

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

那么,你根本不需要<代码> BrPrave/Cuff>函数。

< p>我想知道为什么没有提到标准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);

虽然它可能很复杂,但如果您只是使用
memset(astrk,“*”,n1)
而不是
strcpy(astrk,“*”),它就可以工作了
…但代码确实应该重新构造。@Richard为了确保代码符合标准,您应该对数组使用malloc,数组的大小在运行时确定time@FUZxxl这就是问题所在。对于学习一门语言的人来说,应该向他传授标准,这是每个编译器都应该使用的。此外,我愿意打赌分配的目的是让他们使用动态内存分配。我一直记得,这是教授动态内存的主要用例,即分配在运行时确定大小的数组。此外,如果给定足够的大小,它很可能会溢出,而在堆的情况下,这将以较小的速度出现大得多。哦,因为这是一个要求用数组完成的任务,谢谢你花时间回答。在这种情况下,你可以使用我在另一条评论中提到的(有点黑客味的)
memset
解决方案。
printf(“%c”,ch)
应该被
putchar(ch)取代
信不信由你,我的编译器实际上是将
printf(“%c”,ch)
编译成
putchar(ch)
位于
-O3
。在这种情况下,我只是按照OP的原始代码进行了一些小的清理,但我会实现你的建议。这要么是浪费(如果
BUFSIZ
太大),要么是错误的(如果
BUFSIZ
太小)。什么是BUFSIZ,它只是一个变量吗?+1:是动态数组decl大小导致了头部划痕。这是一个偶尔方便的C-only东西。回答不错。谢谢,@WhozCraig。我同意,可变大小的数组是C99的一个方便功能(虽然它们实际上已经成为C11中的一个可选功能,这意味着您不能指望它们在所有C11实现中都可用)。哦,我很确定您可能会意外溢出(实际上是在下面)堆栈将几乎保证这是C11中的toast,但它有时会派上用场。当索引是无符号字符(255 max alloca)时,我感觉更舒服.为int或size\u t和kerboom传递错误的值=P@nneonneo这正是重点。如果你不能依赖它们,为什么要使用它们呢?特别是我怀疑这个问题是由一个学生提出的,所以他应该学习标准方法。不是一些可能会在某些编译器上崩溃并在其他编译器上工作的东西+1你可以在堆上创建数组.您可以在分配内存之前测试大小变量,然后在创建内存之后测试它..这样做可能会得到额外的分数。
char *arr = malloc(n1);
free(arr);