我希望用户输入仅包含“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");
}
}
为什么它不起作用的任何想法?
答案 0 :(得分:3)
在isStringValid()
函数
char*
,因为将指针传递给要处理的字符串是正常的。K
未定义。 'K'
的字符代码为K
。*(string+i)
n 更高级'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;
}
答案 1 :(得分:2)
试试这个:
int isStringValid(char* str)
{
int i;
for (i=0; str[i]=='P' || str[i]=='K'; i++)
{
}
if (str[i] == '\0')
return 1;
return 0;
}
答案 2 :(得分: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