我试图创建一个具有可变起始长度的数组来获取字符串。代码应该计算单词并调整数组的大小,但这只是一个测试,我在这里公开它,因为我想知道它是一个好习惯还是一个错误。如果有什么我应该知道的,或者我必须记住。
注意,我谈的是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编译器那样接受这个或者有些。
有更好的方法吗?
答案 0 :(得分:1)
做一个[变量]做这项工作是一个好习惯吗?
这取决于某人的编译器配置。 It has been supported since C99.但是,由于没有充分的理由在这样一个简单的程序中使用它,所以请使用标准malloc。 Here'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)