如何遍历字符串的所有字符并检查它们是否都是 C 中的数字?



我正在尝试找到一种方法来检查字符串的所有字符。在网上搜索后,我发现我可以创建一个函数来做到这一点,但由于某种原因它不起作用,即使它非常简单。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct id{
char id_num[10];
};
int isNumber(char p[])
{
int i;
for(i=0; i<strlen(p); i++){
if(isdigit(p[i])){
return 0;
}
else return 1;
}
}

void read(struct id s)
{
int len1;
do{ 
printf("Give id number: ");
scanf("%s", s.id_num);
len1 = strlen(s.id_num);
} while(len1 < 0 || len1 > 10 || isNumber(s.id_num) == 1);
}
int main(void)
{
struct id a;
read(a);
}

如果您想知道为什么我将id_num设置为字符字符串,是因为我需要数字从 0 到 10 个字符。 此外,代码不会出现任何错误,但它需要我输入的任何内容。例如,它接受"5555tt",而不应该。我做错了什么?提前谢谢你。

对于初学者,函数read应通过引用接受其参数,例如

void read(struct id *s);

否则,它的论点就没有意义了。

注意这样的呼唤scanf

scanf("%s", s.id_num);

不安全。请改用fgets。佛罗示例

void read( struct id *s )
{
//...
fgets( s->id_num, sizeof( s->id_num ), stdin );
s->id_num[strcspn( s->id_num, "n" )] = '';

isNumber的功能非常简单。

int isNumber( const char p[] ) 
{
const char *s = p;
while ( isdigit( ( unsigned char )*s ) ) ++s;
return  p[0] != '' && *s == '';
}

也就是说,传递的字符串不应为空(条件p[0] != ''(。否则,很明显它不包含所有数字。

第二个条件*s == ''意味着我们检查字符串的所有字符,直到终止零。也就是说,字符串仅包含数字。

这是一个演示程序。

#include <stdio.h>
#include <ctype.h>
int isNumber( const char p[] ) 
{
const char *s = p;
while ( isdigit( ( unsigned char )*s ) ) ++s;
return  p[0] != '' && *s == '';
}
int main(void) 
{
printf( "Is a number - %sn", isNumber( "" ) ? "true" : "false"  );
printf( "Is a number - %sn", isNumber( "A" ) ? "true" : "false"  );
printf( "Is a number - %sn", isNumber( "12A" ) ? "true" : "false"  );
printf( "Is a number - %sn", isNumber( "123" ) ? "true" : "false"  );
return 0;
}

它的输出是

Is a number - false
Is a number - false
Is a number - false
Is a number - true

在 for 循环中,当您找到一个数字时退出。因此,如果第一个字符5则退出循环。 您需要的是检查所有元素并返回1(如果不是数字(。

int isNumber(char p[])
{
int i;
for(i=0; i<strlen(p); i++){
if(!isdigit(p[i])){
return 1;
}
}
return 0;
}

此外,函数read需要按地址获取参数。void read(struct id *s)

void read(struct id *s)
{
int len1;
do{ 
printf("Give id number: ");
scanf("%s", s->id_num);
len1 = strlen(s->id_num);
} while((len1 < 0) || (len1 > 10) || (isNumber(s->id_num) == 1));
}

相关内容

最新更新