限制C上用户的类型长度

限制C上用户的类型长度,c,C,我的代码要求输入一个10位数字,它将其作为字符串读取,并将其传递给另一个函数,该函数检查用户的输入是否为实数,并且是否没有ASCII字符或符号,然后如果它是好的,则使用atof将字符串更改为变量的数字 我希望用户在输入控制台上只引入10个数字/字符,我的意思是,如果用户输入11个字符,控制台就不会抓取它,或者如果这对于C来说是不可能的,那么如果用户输入超过12个字符,那么程序会发出一条错误消息说它超出了限制,问题是,当我尝试使用这种方法时,例如,如果我输入一些大的数字,如40位数字,那么程序会变

我的代码要求输入一个10位数字,它将其作为字符串读取,并将其传递给另一个函数,该函数检查用户的输入是否为实数,并且是否没有ASCII字符或符号,然后如果它是好的,则使用
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()
仍然是更好的选择。