【发布时间】:2016-11-11 15:24:55
【问题描述】:
我有一个函数int getLine(char s[],int lim),它读取下一行输入,正如有人可能假设的那样,并将其长度作为整数返回。具体
int getLine(char s[],int lim)
{
int i;
char c;
for(i=0; i<lim-1&&(c=getchar())!='\n'; ++i)
{
s[i]=c;
}
s[i]='\0';
return i;
}
到目前为止一切都很好,问题是我不希望用户能够添加任意数量的字符,但我希望他受到限制,所以我添加了这个 int lim 但作为我很快意识到,这与其他循环的合作并不好,例如
int main()
{
double len;
int currentLength=0;
char s[20];
printf("Give an integer N with 1%cN%c30 to make a NxN array\n",242,242);
do
{
printf("N=");
}
while(!((currentLength=getLine(s,20))>0&&try_Parse(s,&len)&&(len - (int)len)==0&&len>=1&&len<=30));
int real_len = (int) len;
double A[real_len*real_len];
for(int i=0; i<real_len; ++i)
{
for(int j=0; j<real_len; ++j)
{
do
{
printf("Give A[%d][%d]=",i+1,j+1);
}
while(!((currentLength=getLine(s,20))>0&&try_Parse(s,&A[i*real_len+j])));
return 0;
}
当运行此代码并为 N 提供类似 (N=0.00000000000000000000001) 或更多零的输入时,程序会读取前 20 个表示好的,我们达到了限制,返回 19 并对其余部分执行相同操作,直到它没有更多可看的了。
我的问题是: 如何阻止它读取超出此限制的输入?
(try_Parse是我自己创建的函数,不要介意)
【问题讨论】:
-
使用
fgets代替你自制的getline?函数。或者更确切地说,getline将getline函数的主体替换为使用fgets的包装器,(约 5 行代码)。 -
对于一个我不知道如何使用它的人(我当然会学习),但我想以它已经构建的方式解决我的问题。不过还是谢谢!
-
如果在
getLine()中达到缓冲区的限制并且还没有看到换行符,添加代码以读取到下一个换行符,丢弃字符:int ch; while ((ch = getchar()) != EOF && ch != '\n') ;(空循环体)。 -
有趣的想法...我会试试的,我会告诉你..再次感谢