我需要从0-9之间的用户获得一个有效的号码,没有重复。有效号码可以是1到10之间的任意数字。如果用户键入"空格"或任何类型的字符,则输入无效。我的算法:
1)创建一个大小为10的char数组,然后将所有单元格初始化为'0'。
2)对于每个从用户读取的字符,检查该字符是否在0-9之间。
2.1)如果为真:分别计算细胞数+1。
2.2) Else "error"。
2.3)如果我得到一个已经有+1的单元格,意味着这个数字已经存在,那么"错误"。
现在有几个关于我的想法的问题:
1)有没有更好的算法?
2)用户不输入一个字符一个字符,这意味着我可以得到一个无限的字符长度,那么我在哪里存储所有的东西?
2)的答案是:根本不存储字符,而是一个一个地处理它们。您只需要存储来记住您已经看到的数字。我想这样做:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char seen[10] = { 0 };
int c, loops;
for (loops = 0; (c = getchar()) != EOF && loops < 10; ++loops)
{
if (!isdigit(c)) {
printf ("Not a digit: %cn", c);
break;
}
c -= '0';
if (seen[c]) {
printf ("Already seen: %dn", c);
break;
}
seen[c] = 1;
}
return 0;
}
尝试修改这个程序作为练习:减少seen[]
数组的存储需求。写入时,每个数字使用一个字节。