代码之家  ›  专栏  ›  技术社区  ›  Mr T

检查字符串中是否存在C中的某些字符值?

  •  0
  • Mr T  · 技术社区  · 10 年前

    我希望用户键入一个字符串 仅包含“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;
    }
    

    我正在使用scan f从用户处获取字符串,但isStringValid函数似乎无法正常工作。无论我键入什么字符串,它都只返回false!

    int main(){
    char string[30];
    
    scanf("%s", string);
            if(isStringValid(&string)){
                printf("Job Done!\n");
            }else{
                printf("Not recognised!\n");
            }
    }
    

    你知道为什么它不起作用吗?

    3 回复  |  直到 10 年前
        1
  •  3
  •   MikeCAT    10 年前

    在里面 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;
    }
    
        2
  •  2
  •   barak manos    10 年前

    试试这个:

    int isStringValid(char* str)
    {
        int i;
        for (i=0; str[i]=='P' || str[i]=='K'; i++)
        {
        }
        if (str[i] == '\0')
            return 1;
        return 0;
    }
    
        3
  •  0
  •   joop    10 年前
    #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
    
    推荐文章