【问题标题】:How to allow user to input both string and int at the same time using C [closed]如何允许用户使用 C 同时输入字符串和 int [关闭]
【发布时间】:2020-03-22 00:53:53
【问题描述】:

我想知道是否有人知道如何允许用户在验证输入的每个字符的同时输入字符串(字符)和整数。输入的一个例子是"05JK1010"。我上周才开始学习 C 语言,所以我才弄明白这个

char studentID [20];

printf("Enter your student ID:\n");
        scanf("%s", &studentID );

【问题讨论】:

  • 字符只是用字母或符号表示的数字。字符“0”的十进制值为 48。这是一个 table,其中包含所有 ascii 字符及其数值。您可以使用此信息将整个输入作为字符串处理。
  • 不清楚:在什么意义上输入05JK1010 既是字符串又是int 输入?也许一些关于预期用途的额外信息会有所帮助。
  • 如果您想在输入时验证每个字符或整数,则必须使用像 getch() 这样的函数进行循环,然后将该输入与保存的密钥进行比较,然后再继续来自用户的下一个值。我不相信 getch() 可以移植到所有平台。
  • 不要养成坏习惯。验证检查返回使用的每个输入函数。使用fgets() 使用临时缓冲区读取整行,例如#define MAXC 1024 然后 char buf[MAXC]; fputs ("Enter ID: ", stdout); if (fgets (buf, MAXC, stdin) == NULL) { /* handle error */ } 然后使用 sscanfbuf 解析您需要的值,例如if (sscanf (buf, "%19s", studentID) != 1) { /* handle error */ }; printf ("got ID: %s\n", studentID);。您也可以简单地使用一对指针从buf 的开头到结尾挑选出您需要的内容。由你决定。
  • 请参阅Determine number or character in textfile C,了解处理类似于您的 ID 的混合输入的方法。

标签: c string int


【解决方案1】:

你很接近,但我认为我有更好的方法来做到这一点。 GNU libc 的 scanf 接受具有 %[ 格式的范围,如下所示:

scanf("%19[0-9a-zA-Z]", studentID);

如果您调整数组大小,您应该使用不同的大小来代替 19。这是为了确保scanf 不会溢出缓冲区。

另外,如果scanf 的参数之一的格式说明符是%s%[,则通常不应获取该参数的地址。

如果您需要便携的解决方案,那就是满口:

scanf("%19[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]", studentID);

更多关于scanf的信息,请看我的帖子What can I use for input conversion instead of scanf?

【讨论】:

  • 正确使用 field-width 修饰符和解释以防止缓冲区溢出——值得单独使用 UV。用fgets() 阅读和用sscanf() 解析如果我能同时给出两个值,那就值2。
【解决方案2】:

C 没有允许同时输入整数和字符的功能。 就像 Joshua 上面评论的那样,字符只是表示为 ASCII 符号的整数。

如果您需要输入的数字为整数形式,则必须从字符串中解析它们并使用各种方法将它们转换为数值。

C 确实有一个函数可以将 ASCII 转换为整数 atoi()

http://www.cplusplus.com/reference/cstdlib/atoi/

请注意,atoi() 没有错误检查,这只是给你一些想法。

【讨论】:

  • 对此我不确定。只需 %[0-9a-zA-Z]scanf 即可。
  • @S.S.Anne,只是将输入掩码为数字 0 - 9、字符 a - z 或 A -Z。它仍将作为 ascii 值存储在 char 数组中。
  • 我认为这就是目的。 OP 只是不知道整数可以存储在字符中。
  • @S.S.Anne,是的,这可能是,抛出我的部分是他的具体要求——“同时输入字符串(字符)和整数,其中 输入已验证”。不管是int还是char,每个“char”都可以验证。
  • 哎呀!从不推荐atoi() 它提供零错误检查或诊断。你可以做int i = atoi ("cow");,它会默默地返回零作为整数值。要么读入缓冲区并使用sscanf(),要么声明一个临时的long 并使用strtol()——它提供了完整的验证能力。 C 确实允许您输入任意数量的混合数字和字母字符。将它们解析为整数和字符串取决于您。一切都可以完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-22
相关资源
最近更新 更多