限制C上用户的类型长度
我的代码要求输入一个10位数字,它将其作为字符串读取,并将其传递给另一个函数,该函数检查用户的输入是否为实数,并且是否没有ASCII字符或符号,然后如果它是好的,则使用限制C上用户的类型长度,c,C,我的代码要求输入一个10位数字,它将其作为字符串读取,并将其传递给另一个函数,该函数检查用户的输入是否为实数,并且是否没有ASCII字符或符号,然后如果它是好的,则使用atof将字符串更改为变量的数字 我希望用户在输入控制台上只引入10个数字/字符,我的意思是,如果用户输入11个字符,控制台就不会抓取它,或者如果这对于C来说是不可能的,那么如果用户输入超过12个字符,那么程序会发出一条错误消息说它超出了限制,问题是,当我尝试使用这种方法时,例如,如果我输入一些大的数字,如40位数字,那么程序会变
atof
将字符串更改为变量的数字
我希望用户在输入控制台上只引入10个数字/字符,我的意思是,如果用户输入11个字符,控制台就不会抓取它,或者如果这对于C来说是不可能的,那么如果用户输入超过12个字符,那么程序会发出一条错误消息说它超出了限制,问题是,当我尝试使用这种方法时,例如,如果我输入一些大的数字,如40位数字,那么程序会变得疯狂,并发送无法理解的结果,如“1.#J”,或者如果我在数字中间输入一个字符,那么它会发送我为用户设置的相应错误消息,以避免输入字符,但它仍然抓住部分数字并接受它,因为它没有错,下面是我尝试的代码的main
:
int main() {
char chain[10];
float N;
int valid=0;
do{
printf("introduce real numbers: ");
fgets(chain, sizeof(chain), stdin);
if( chain[strlen(chain)-1] == '\n')
chain[strlen(chain)-1] = '\0';
valid=validate_numbers(chain);
}while(valid==0);
N=atof(chain);
printf("float number is: %.2f", N);
getche();
return 0;
}
下面是更多扩展检查的其余代码:
如果有一些新手错误或者问题很简单,我很抱歉,我是一个新的编程人员。用
scanf
代替fgets
怎么样?应读取9个字符并将其保存为字符串:
scanf("%9s" , &chain)
我建议阅读和手册页 改变这一点:
char chain[10];
为此:
char chain[11]; // +1 for the NULL terminator
由于C字符串应该以NULL结尾,因此我们需要为数组中的NULL终止符保留一个单元格(它将存储我们的字符串)
我的意思是,如果用户输入11个字符,控制台就不会抓取它 在C中不可能 或者,如果这对于C来说是不可能的,那么如果用户在输入上输入了超过12个字符,那么程序就会发出一条错误消息,说它超出了限制 是的,让我们这样做!读取字符串,如果长度超过10个字符,则打印错误消息 允许
chain
数组的大小为12(10表示有效输入的最大长度,1表示额外字符(如果有),1表示空终止符),以便我们可以存储额外字符(如果有)
例如:
#include <stdio.h>
#include <string.h>
int main(void)
{
char chain[12];
printf("introduce real numbers:\n");
fgets(chain, sizeof(chain), stdin);
chain[strcspn(chain, "\n")] = '\0';
if(strlen(chain) > 10)
{
printf("Error: Maximum length of chain is 10! Exiting..\n");
return 1;
}
return 0;
}
#包括
#包括
内部主(空)
{
碳链[12];
printf(“引入实数:\n”);
fgets(链,尺寸(链),标准尺寸);
链[strcspn(链,“\n”)]='\0';
如果(strlen(链)>10)
{
printf(“错误:链的最大长度为10!正在退出..\n”);
返回1;
}
返回0;
}
注意:您可以使用EXIT\u SUCCESS
和EXIT\u FAILURE
,而不是普通数字(分别为1和0):
与OP的问题无关:但是在完整版本的代码中,有过多的问题,例如代码的顶行
int valid=validate_numbers(char number[])代码>,它希望声明该方法。它应该是validate_number(字符号[])代码>。方法的定义也是如此。确保再次阅读所有代码,并阅读编译器赠送给您的信息。:) 我正要提到函数名。另一个严重的问题是使用long
作为变量名!请参见此,了解该关键字在C中保留的内容。chain[strlen(chain)-1]
是一种黑客攻击,它将第一个读取字符作为空字符<代码>链[strcspn(链,“\n”)]='\0'
是一个很好的选择。@chuxmonica我明白你的意思,答案更新了,谢谢scanf(“%9s”,&chain)
很好地限制了输入并防止了缓冲区溢出,但将尾部的\n
留在stdin
中供下一个I/O函数使用fgets()
仍然是更好的选择。