我想限制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