如何编写只接受某些字符的scanf()语句?

时间:2015-12-12 02:04:28

标签: c logic boolean-logic

对于我正在编写的程序,我需要使用scanf()仅扫描0-9,A-Z和a-z之间的字符。

我想我可以使用一些不错的比较运算符来帮助我实现目标。例如,也许这可行:

int i = 3;
char a[7] = {'a', 'b', 'c', '?', 'e', 'f', '\0'};

if (!(a[i] >= '0' && a[i] <= '9') && !(a[i] >= 'A' && a[i] <= 'Z') && !(a[i] >= 'a' && a[i] <= 'z'))
  printf("not 0-9. A-Z, or a-z!\n");

换句话说,如果a[i]中的字符不是数字或字母,则打印该语句。但是,这没有用。任何替代方案?

3 个答案:

答案 0 :(得分:2)

C标准库提供了将字符测试为digitletter的功能:

if (!isalpha(a[i]) && !isdigit(a[i])) {
    printf("Not a letter or a digit\n");
}

您需要包含<ctype.h>才能引用这些功能。

答案 1 :(得分:1)

根据评论编辑:

要让scanf()只输入某些字符,你可以尝试:

char buffer[100] = {'\0'};
if( 1 != scanf( "%99[0-9A-Za-z]", buffer ) )
{ // scanf failed -- EOF or I/O error
     perror( "scanf failed" );
     exit( EXIT_FAILURE );
}

这个问题没有讨论在遇到“非期望的”之后是否要继续输入。性格也不怎么处理“不希望的”因此我不会假设第二次猜测问题情景。

最多可以输入99个字符但如果遇到0 ... 9,A ... Z以外的任何字符则会停止。 A ... Z

答案 2 :(得分:1)

要使用scanf()仅接受某些字符,请使用"%[]"

定义扫描集
char dest[80];

if (scanf("%79[0-9A-Za-z]", dest) == 1) {
  printf("Success.%s.\n", dest);
} else {  
  puts("Fail");
  fgetc(stdin);  // Consume non-matching character.
}