【问题标题】:How to detect space and letters in a Char in C?如何检测C中Char中的空格和字母?
【发布时间】:2024-01-23 03:29:02
【问题描述】:

您知道如何检测 CHAR 变量中的空格和字母吗?

我需要检测数字输入中的字母或空格:

这是我想做的:

Enter Document Number of 8 numbers: 
// i press space and pressed enter
ERROR: please enter the age again: 4fpdpfsg

我的代码没有检测到 4 之后的字母,我想要的是识别输入中有字母,然后只显示 4。

int isLetter(char input[]){
    int i = 0;

    while(input[i]!='\0'){
        if((input[i]!=' ') && (input[i]<'a'||input[i]>'z') && (input[i]<'A'||input[i]>'Z'))
        return 0;
        i++;
    }

    return 1;
}

【问题讨论】:

  • 试试isalpha 和类似的函数系列。
  • 你的代码有什么问题?它运行吗?它会给出错误的结果吗?
  • 运行,但例如输入应该检测为正确的 8 个“数字”,没有字母,只有像 12345678 这样的数字,但如果我写 1234abcd 只检测到 1234,并且不会在输入时给出错误消息。
  • 你工作太辛苦了; strtoul是你不知道你需要的库函数。

标签: c string char letter


【解决方案1】:

试试:

if (!((input[i] == ' ') || (input[i] >= 'a' && input[i] <= 'z') || (input[i] >= 'A' && input[i] <= 'Z')))

或者,更好:

#include <ctype.h>
if (!((input[i] == ' ') || isalpha(input[i])))

【讨论】:

    【解决方案2】:

    嘿伙计们,我终于找到了检测输入是否符合代码的方法

    char* InputDni(char dni[])
    {
        int sizeletter;
        int i;
    
        fflush(stdin);
        gets(dni);
    
        // 8 is the size of DNI in argentina
    
        while((isLetter(dni)) || (strlen(dni)!=8))
        {
            printf("ERROR: enter again the DNI: ");
            fflush(stdin);
            gets(dni);
        }
    
        sizeletter=strlen(dni);
    
        for(i=0 ;i<sizeletter; i++)
        {
            while(isalpha(dni[i]))
            {
                printf("ERROR: enter again the DNI: ");
                fflush(stdin);
                gets(dni);
                i++
            }
        }
    
        return dni;
    }
    

    //是字母

    int isLetter(char input[])
    {
        int i = 0;
        int sizeletter;
        int flag=1;
    
        sizeletter=strlen(input);
    
        for(i=0;i<sizeletter;i++)
        {
            if((input[i]!=' ') && (input[i]<'a'||input[i]>'z') && (input[i]<'A'||input[i]>'Z'))
            {
                flag=0;
            }
        }
    
        return flag;
    }
    

    cmd中运行的代码图片:

    【讨论】:

      【解决方案3】:

      标准 C 库具有各种字符类型测试功能。它们在 #include &lt;ctype.h&gt; 标头中声明。

      不幸的是,使用这些函数的明显方式往往是错误的。它们采用int 类型的参数,它实际上应该是0 到UCHAR_MAX 范围内的无符号字符值(实际上是一个字节)。如果您传入恰好为负数的char 值,则会出现未定义的行为,这可能巧合crash 或更糟糕的是形成类似于 heartbleed 的漏洞(可能更糟糕)

      因此,在以下情况下很可能需要转换为 (unsigned char)

      #include <ctype.h>
      /* ... */
        char ch;
        /* ... */
        if (isalpha((unsigned char) ch) || ch == ' ') {
          /* ch is an alphabetic character, or a space */
        }
      

      从 C 转换时间字符集派生的简单字符常量(不是数字转义的)在执行环境中具有正值;可以安全地假设它只操纵这些字符的代码可以在没有演员表的情况下完成。 (例如,如果程序操作的所有数据都来自程序本身的字符串或字符文字,并且所有这些文字只使用基本的 C 翻译时间字符集。)

      也就是说isalpha('a')是安全的; a 在 C 转换时间字符集中,因此字符常量 'a' 的值为正。但是假设您正在使用 ISO-8859-1 中的源代码并拥有char ch = 'à';。如果 char 已签名,则此 ch 将具有负值,根据 ISO C,这很好,因为重音 à 不在基本 C 翻译字符集中。表达式isalpha(ch); 然后将负值传递给isalpha 函数,这是错误的。

      【讨论】:

        【解决方案4】:

        您可以使用sscanf(input,"%d%n",&amp;number,&amp;nrOfDigits) 将整数值读入number 并另外存储第一个字符的位置,该字符不是nrOfDigits 中数字的一部分。有了这些信息,您就可以决定要做什么,例如nrOfDigits &lt; 8 表示输入少于 8 个字符,或者它包含少于 4 个连续数字。请参阅下面的使用示例代码。

        #include <stdio.h>
        #include <stdlib.h>
        #include <ctype.h>
        
        int isLetter(char input[]){
        
            int nrOfDigits=0;
            int number;
            int scannedElems = sscanf(input,"%d%n",&number,&nrOfDigits);
            if (scannedElems == 0) {// number could not be read--
                printf ("No number read.\n");
                return 0;
            }
            else {
                char c = input[nrOfDigits];
                int isAlpha = isalpha(c);
                printf("input %s leads to number %d with %d digit(s); first characer after the digits is '%c', (isalpha=%d)\n", input, number, nrOfDigits, c, isAlpha);
                return number;
            }
        }
        
        
        int main(){
        
            isLetter("4fpdpfsg");  // input 4fpdpfsg leads to number 4 with 1 digit(s); first characer after the digits is 'f', (isalpha=1)
            isLetter("afpdpfsg"); // No number read.
            isLetter("12345678"); // input 12345678 leads to number 12345678 with 8 digit(s); first characer after the digits is '�', (isalpha=0)
            return 0;
        }
        

        顺便说一句:您也可以使用 strtoul 实现类似的逻辑。

        【讨论】:

          最近更新 更多