[英]Check a string for certain character values in C?
我希望用户键入仅包含'P'和'K'字符的字符串 。 这就是我在主函数中声明的字符串,
char string[30];
这是一个函数,如果字符串满足该条件,则返回1,否则返回0:
int isStringValid(char **string){
int i=0;
while(*(string+i)!='\0'){
if(*(string+i)!='P' || *(string+i)!='K'){
return 0;
}
++i;
}
return 1;
}
我从用户使用扫描f获取字符串,但是isStringValid函数似乎无法正常工作。 无论我键入什么字符串,它都只会返回false!
int main(){
char string[30];
scanf("%s", string);
if(isStringValid(&string)){
printf("Job Done!\n");
}else{
printf("Not recognised!\n");
}
}
任何想法为什么它不起作用?
在isStringValid()
函数中
char*
因为将指针传递给字符串进行处理是正常的。 K
是不确定的。 'K'
是的字符码K
。 *(string+i)
为n,则'P'
P'n 或 'K'
”。 size_t
用作计数器更好。 在main()
函数中
void
指定为参数。 isStringValid()
参数类型已更改,因此应将指针传递给字符串。 更正的代码:
#include <stdio.h>
int isStringValid(char *string){
size_t i=0;
while(*(string+i)!='\0'){
if(!(*(string+i)=='P' || *(string+i)=='K')){
return 0;
}
++i;
}
return 1;
}
int main(void){
char string[30];
if (scanf("%29s", string) != 1){
printf("Read error!\n");
}else if(isStringValid(string)){
printf("Job Done!\n");
}else{
printf("Not recognised!\n");
}
return 0;
}
尝试这个:
int isStringValid(char* str)
{
int i;
for (i=0; str[i]=='P' || str[i]=='K'; i++)
{
}
if (str[i] == '\0')
return 1;
return 0;
}
#include <stdio.h>
int Only_PK_present(char *str)
{
for( ; *str == 'K' || *str == 'P'; str++ ) {;}
return !*str;
}
int Only_PK_present1(char *str)
{
for ( ; *str ; str++) {
if (*str == 'K') continue;
if (*str == 'P') continue;
break;
}
return !*str;
}
int Only_PK_present2(char *str)
{
do {
if (*str != 'K' && *str != 'P' ) break;
} while (*str++);
return !*str;
}
// Or even shorter :
#include <string.h>
int Only_PK_present0(char *str)
{
return !str[strspn(str, "KP")];
}
int main(int argc, char **argv)
{
printf("%d %d %d %d\n"
, Only_PK_present(argv[1])
, Only_PK_present1(argv[1])
, Only_PK_present2(argv[1])
, Only_PK_present0(argv[1])
);
return 0;
}
当至少使用-O2
编译时,GCC将内联strspn(),并为Only_PK_present0()产生以下效果:
.globl Only_PK_present0
.type Only_PK_present0, @function
Only_PK_present0:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
jmp .L23
.L24:
addl $1, %eax
.L23:
movzbl (%eax), %edx
cmpb $75, %dl
je .L24
cmpb $80, %dl
je .L24
testb %dl, %dl
sete %al
movzbl %al, %eax
popl %ebp
ret
.size Only_PK_present0, .-Only_PK_present0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.