你知道如何检测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;
}
答案 0 :(得分:2)
尝试:
if (!((input[i] == ' ') || (input[i] >= 'a' && input[i] <= 'z') || (input[i] >= 'A' && input[i] <= 'Z')))
或者,更好:
#include <ctype.h>
if (!((input[i] == ' ') || isalpha(input[i])))
答案 1 :(得分:2)
标准C库具有各种字符类型测试功能。它们在#include <ctype.h>
标题中声明。
不幸的是,使用这些功能的明显方法通常是错误的。它们采用类型int
的参数,实际上预期它是0到UCHAR_MAX
范围内的无符号字符值(有效字节)。如果您传入的char
值恰好为负值,则未定义的行为会随之而来,这可能巧合地工作, crash < / em>或者更糟的是形成一个类似于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
函数,这是错误的。
答案 2 :(得分:0)
您可以使用sscanf(input,"%d%n",&number,&nrOfDigits)
读取number
中的整数值,并另外存储第一个字符的位置,该位置不是nrOfDigits
中数字的一部分。有了这些信息,您就可以决定做什么,例如nrOfDigits < 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;
}
BTW:您也可以使用strtoul
实现类似的逻辑。
答案 3 :(得分:0)
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;
}
// isLetter
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中运行的代码的图片: