检查C中某些字符值的字符串?

时间:2016-03-01 13:39:25

标签: c string char

我希望用户输入仅包含“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");
        }
}

为什么它不起作用的任何想法?

3 个答案:

答案 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