【问题标题】:How would I write a scanf() statement that only accepts certain characters?我将如何编写只接受某些字符的 scanf() 语句?
【发布时间】:2015-12-12 02:04:27
【问题描述】:

对于我正在编写的程序,我需要使用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] 中的字符不是数字或字母,则打印该语句。但是,那没有用。有其他选择吗?

【问题讨论】:

  • 检查 C 标准库怎么样。以ctype.h开头。

标签: c logic boolean-logic


【解决方案1】:

C 标准库提供了测试字符为digitletter 的函数:

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

您需要包含&lt;ctype.h&gt; 才能引用这些函数。

【讨论】:

  • 或者只是if(!isalnum(a[i]))。虽然给出了问题的标题,但它可能是关于%[A-Za-z0-9]
【解决方案2】:

根据 cmets 编辑:

要让 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。

【讨论】:

    【解决方案3】:

    要使用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.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      相关资源
      最近更新 更多