繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM