c语言怎样控制输入的字符长度,关于字符串:输入太长时,如何限制C语言的scanf函数打印错误?...

我想限制scanf函数,所以当我输入一个char* array时,该字符具有30个以上的字符,它将无法得到它,并且我的输出将是错误的。

我得到使用[^ n]之类的提示,但我不知道该怎么做?

我知道我可以使用scanf("%30s"..),但是我不希望输入有效,而只是错误。

任何帮助都会很棒。

我很确定没有这样的事情。 给定30个与您的转换规范匹配的字符,它将成功,无论是否还会有更多的字符。 由您决定读取下一个字符并验证其是否是换行符或类似内容(但这仍然不会退回您读取的30个字符)。

如果必须使用scanf,那么我认为最好的方法是使用宽度说明符,例如:"%31s",如前所述,然后使用strlen检查输入的长度,并丢弃该字符串,如果输入的长度超出限制,则报告错误。

或者可能通过在格式字符串中另外使用%n来跳过strlen,例如"%31s%n"。

使用%[^\

]之类的格式字符串代替%s的格式字符串只是指示该函数继续读取直到换行,并在此过程中消耗了其他空白字符。如果要允许输入包含空格字符,这将很有用。

查看scanf的文档(这是手册页的副本)。

我认为您是要说%31[^\

]。

查看此页面http://linux.die.net/man/3/sscanf并查找%n格式说明符。我还建议您查看sscanf函数的返回值,该值将告诉您格式化参数的数量以及错误的存在。

我使用%n格式说明符来帮助解析参数字符串:

ret = sscanf(line,"%d %d %s %d %d %n", &iLoad, &iScreen, &filename, &stage, &bitmapType, &offset);

由前面的参数格式化的字符数存储在变量offset中。

您可以使用fgets和sscanf。使用fgets,您可以读取不超过30个字符,然后检查是否获得的字符不超过30个字符。

或者,如果您真的想使用scanf,请使用除30以外的其他内容,例如%32s。

我们的校长告诉我们不幸使用了scanf,并给出了一个提示-scahnf("%[^ n * c),但我不明白:O

您可以在循环中使用getchar,并计算传入的字符。

int iCharCount = 0;

ch = getchar();

while( ch != EOF ) {

iCharCount++;

if(30 < iCharCount)

{

printf("You have attempted to enter more than 30 characters.\");

printf("Aborting.");

break;

}

printf("%c", ch );

ch = getchar();

}

这是一个粗略的例子。如果要由我决定,我将分配一个最大尺寸的字符数组,读入整行,然后使用字符串实用程序对其进行计数,编辑等。

@moooeeeep谢谢。 做完了

在C语言中,您可以执行以下操作:

#include

...

if(strlen(array_ptr) > 0) error();

显然,您需要一个更大的缓冲区才能真正首先获得输入,然后检查其长度,因此该数组可以是例如512字节将字符串复制到该字符串时,需要检查最后是否得到0。

:-)因此,您被要求处理scanf函数中的错误代码-好吧,scanf返回匹配项的数量,但是如果匹配项上的代码或如何指定匹配项,它看起来会有些棘手。 您应该在会上的课上;-)

sscanf对于这种事情非常有用,但是小心的scanf也可以在这里完成技巧。您将要确保正确限制用户可以输入的字符数,因此%31s表示最大30个字符+ \\0空终止符(31)。

您要防止的是缓冲区溢出攻击,这可能是破坏草率编写的c程序的极其有效的方法。这是Aleph One在BO上的精彩文章:

http://insecure.org/stf/smashstack.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值