C语言中可以限制输入类型吗??例如只可以输入数字,输入其他会报错!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中可以限制输入类型吗??例如只可以输入数字,输入其他会报错!!相关的知识,希望对你有一定的参考价值。

如可以的话,请教教小弟好吗??
#include<stdio.h>
typedef struct

int data[71];
int n;
Stack;
void Pop(Stack*s,int num)

s->n++;
s->data[s->n]=num;

void Push(Stack*s,int*num)

*num=s->data[s->n];
s->n--;

int IsEmptyStack(Stack s)

if(s.n==0)return 1;
else return 0;

void DisChangeTo(int num,int f)

int w=0;
Stack s=0,0;

while(num>0)

Pop(&s,num%f);
num/=f;

printf("\n%d jinzhi is:",f);
while(!IsEmptyStack(s))

Push(&s,&w);
if(w>=0&&w<=9) printf("%d",w);
else printf("%c",w+55);

printf("\n");

int main()
int f,v,num;
while (1)
printf ("Please chose the action 0 for exit 1 for start:");
scanf ("%d",&v);
if (v==1)
printf ("Please input the jinzhi:");
scanf ("%d",&f);
if(f==8||f==16||f==2)
printf("Please input the number:");
scanf ("%d",&num);
DisChangeTo(num,f);
else
printf("The jinzhi is wrong\n");
v=0;
else if (v==0)
system("pause");
exit(1);
else
printf ("This action is wrong!\n");
v=0;

可以实现.
假设你只想要数字,申请变量的时候就申请int型的,用户输入字母的话程序就报错了...估计还会崩溃~

还一种方法就是接受输入后判断一下.
char c;//这地方就不能用int了,就如上边说的-接受到字母会崩溃.
while((c=getchar())!='\n') //接受输入,并且判断是否非空.

if(c>='0'&&c<='9')
//如果是数字怎么样...
else
//如果是非数字怎么样...


注意上面用while是循环输入,如果只输入一个字符while去掉.
如果不想用while就用char[100]类这的数组.
希望能给你些帮助.
参考技术A 判断是否为数值,是就通过,不是则报错。
用个if判断就OK了,应该有个函数能比较是否为数值的。
另外就从ASCII来判断,大于小于,就能把限定在数字范围内了。
参考技术B 没有这个函数。不过可以自已编写。比如输入数字,你就把数字当作字符串进行录入,再作检查,如果其中有非数字字符刚报错。然后再写一个函数把字符串转为int型或者double。给你要用到的函数吧
template <class TYPE>
void CharToNum(char *string,TYPE *num)
//通过使用模版,把char型转换成任意型。
//这样通过读入字符串,再转换成int,long;

unsigned int m=strlen(string);
*num=0;
for(unsigned int i=0;i<m;i++)

*num=*num*10+(*(string++)-'0');



int InputIntOnly(char *string) //用户只能向屏幕输入数字

while(*string!='\0')

if((*string>='0'&&*string<='9'))

string++;

else
return 0;

return 1;

在 C 中存储前导零

【中文标题】在 C 中存储前导零【英文标题】:Store leading zeroes in C 【发布时间】:2019-02-23 22:24:36 【问题描述】:

对于初学者来说,我是编程新手

我想知道如何使用 scanf 存储带有前导零的数字,而不是修改 printf。它与数据类型有关吗?如果是这样,它是什么?我该如何使用它?我目前只知道 int、double 和 float

例如,我想输入数字“02”并接收“02”作为输出,当我输入“2”时,输出也将是“2”。

【问题讨论】:

没有这样的数字“02”。您可以按原样存储字符串,也可以单独存储字符串中前导零的数量(如果有)。 数字类型没有前导零的概念。他们甚至没有十进制数系统的概念。这一切都只是二进制。 危险。将 010 解释为 8 可以原谅智能输入例程,因为前导 0 用于指定 八进制 常量。 @LeonardoAlvesMachado 从技术上讲,char c[5] 将是一个 4 字母字符串,因为第五个字符将是终止 NUL 字节,通常不被视为“字母”(例如,根据strlen)。此外,C 中的字符串特别是一个由 NUL 字节终止的char 数组,而char c[5] 也可能只包含五个不是字符串或用作一个字符串的char @LeonardoAlvesMachado: char c[5]; 定义了一个能够容纳 5 个元素(char 类型)的数组。 “字符串”需要一个终止 '\0' 字节,它必须在底层数组中。所以,c 可以容纳最多 4 个字母长度的字符串。 【参考方案1】:

使用scanf 说明符diouxae、@9876543@30@、@9876543 的结果是一个数学数字13 .没有前导零。从概念上讲,数字中没有数字。它是一个纯粹的数学实体。 (正如Jonathan Leffler 所指出的,输入中的前导零与i 说明符有关;前导零在解释数字时将基数更改为八进制。这仅用于输入;结果仍然是一个没有相关数字或基数的数字.)

要保留数字的前导零,您必须将其视为字符串。 scanf 可用于读取带有 sc[ 说明符的字符串或单个字符,尽管您可能希望使用简单的获取字符函数,例如 getchar。您必须自己计算前导零。剩余的数字也可以作为字符串处理,或者您可以将它们转换为数字。

【讨论】:

对于%i,前导零很重要——017 和 17 是不同的值(八进制 017 是十进制的 15;17 仍然是十进制的 17)。这会捕获人们使用%i 编写日期解析代码来扫描日期或月份(使用%i,输入09 给出零值,并将9 留给下一个转换说明符解释)。 【参考方案2】:

如何存储带有前导零的数字 (?) 我目前只知道 int、double 和 float

要存储一个整数,前导零计数是 2 条信息。读取用户输入时,记录数字其长度或文本宽度。

" " 消耗空格。"%n" 记录到目前为止扫描的字符的偏移量。这不影响scanf()的返回值。

int num;
int n1, n2;
if (scanf(" %n%d%n", &n1, &num, &n2) != 1) 
  puts("Failed to read an int");

否则,打印它。"0":用零填充。"*":从参数列表导出的最小打印宽度。

else 
  int length = n2 - n1;
  printf("%0*d\n", length, num);

输入/输出

  007
007

【讨论】:

【参考方案3】:

如果您将数字存储为整数(例如,int)或浮点类型,任何格式信息都不可避免地丢失:仅存储数字的二进制表示。 (将其视为保存数字的 idea 可能会有所帮助,例如“二”,而不是写入时的外观。)

您需要在别处存储任何附加信息,例如通过保存原始字符串并将其用于输出,或者通过保存位数并将其应用于printf 格式。还有一些十进制数库可以在内部保存数字的十进制表示,但这比使用本机类型要重得多。

(或者,只需选择规范的输出格式并使用它而不管输入。目标真的是保持任何输入格式原样,还是总是添加前导零就足够了输出?)

【讨论】:

【参考方案4】:

如前所述,数字没有前导零。

但是你可以把它当作一个字符串来处理

printf("Enter num: ");
char buf[50];
scanf("%s", &buf);
printf("You entered: %s", buf);

【讨论】:

【参考方案5】:

如果您有一个 int 值,则在内部它始终表示为一定数量的位(或您的 CPU 使用的任何 to store numbers),因此您无法控制它。

就内部格式而言,总是有“前导零”,例如,因为 2099 实际上是 32 位格式的 0b00000000000000000000100000110011。由于endian issues,这变得更加复杂,但原理仍然成立。

前导零唯一有意义的情况是,如果您使用的是已经过时的binary coded decimal,或者是由sprintf 类型函数生成的字符串表示法。

只有人类才关心数字。就计算机而言,添加 1+1 和 6916863870493370158+6471945999301299985 一样困难,因为它们都是 64 位操作。

【讨论】:

以上是关于C语言中可以限制输入类型吗??例如只可以输入数字,输入其他会报错!!的主要内容,如果未能解决你的问题,请参考以下文章

用C++或者C如何实现限制输入的只能是数字,其余类型的直接退出

c语言 如何判断输入的是数字还是字母

DLL文件没有语言限制吗?

C#Textbook中如何限制输入只为数字

C#Textbook中如何限制输入只为数字

c语言float可以输入指数吗