在C中创建用户长度定义的数组

时间:2017-12-03 22:02:47

标签: c arrays

我试图创建一个具有可变起始长度的数组来获取字符串。代码应该计算单词并调整数组的大小,但这只是一个测试,我在这里公开它,因为我想知道它是一个好习惯还是一个错误。如果有什么我应该知道的,或者我必须记住。

注意,我谈的是C,而不是C ++

#include <stdio.h>
int main()
{       int c,b,count;
        scanf("%d",&c);
        count=c+1;
        getchar();
        char a[count];
        for ( c=b=0 ; c!=count && b!='\n' ; c++ )
        {
                b=getchar();
                a[c]=b;
        }
        a[c]='\0';
        printf("%s",a); printf("%d",c-1);
}

我不需要在执行时更改数组的大小。

我正在测试,我不记得为什么我第一次使用c变量而不是直接使用count,但我记得第一次使用getchar来冲洗缓冲区,因为没有getchar它没有工作。

我不知道为什么需要把getchar放进去。如果删除getchar,程序将失败。

无论如何,程序运行正常。第一次运行时,它需要一个带有scanf的数字,然后需要文本。

如果文本大于数组的大小,程序将忽略它。

数字是数组的大小。

我的问题是:

a[variable]做这项工作是一个好习惯吗?

为什么我需要getchar?

便携式?我的意思是,我不知道某些系统或标准是否不像某些旧的C编译器那样接受这个或者有些。

有更好的方法吗?

3 个答案:

答案 0 :(得分:1)

  

做一个[变量]做这项工作是一个好习惯吗?

这取决于某人的编译器配置。 It has been supported since C99.但是,由于没有充分的理由在这样一个简单的程序中使用它,所以请使用标准mallocHere's an in-depth discussion of the topic.

  

为什么我需要getchar?

您的终端中可能仍有一些输入已缓冲,并且第一个字符正在丢弃它。尝试将值打印到屏幕上以查看它是什么,这可能会有所帮助。

  

它是便携式的吗?

请参阅我对第一个问题的回答。它可能适用于现代版本的gcc,但是例如它在Windows C中不起作用(基本上仍然在C89上)。

答案 1 :(得分:0)

  

做一个[变量]做这项工作是一个好习惯吗?

如果大小是由任意用户输入决定的,没有强制限制,那么不是良好做法。用户可以轻松输入一个非常大的值并超出堆栈。

使用动态分配,或检查并强制输入值到某个合理的限制。

另外值得注意的是,C ++或某些C编译器不支持VLA,因此代码缺乏可移植性。

  

为什么我需要getchar?

用户必须输入至少 换行符才能返回scanf(),但%d格式说明符不会消耗非数字字符,因此保持缓冲状态。但是,通过输入其他非数字字符可以轻松打破您的代码,例如"16a<newline>"会将16分配给c,而a将被丢弃,新线路将像以前一样进行缓冲。更好的解决方案是:

while( getchar() != `\n` ) {}
  

便携式?我的意思是,我不知道某些系统或标准是否不像某些旧的C编译器那样接受这个或者有些。

采用C99 VLA是可变的,在C11中,它们在任何情况下都是可选的。

  

有更好的方法吗?

我犹豫说&#34;更好&#34;,但更安全,更灵活,更便携的方式。关于数组分配,您可以使用malloc()

答案 2 :(得分:-1)

malloc

中使用callocC是更好的选择

https://www.tutorialspoint.com/c_standard_library/c_function_malloc.htm