使用指针验证字符串是否只包含一组有限的子字符串

时间:2012-06-21 08:52:31

标签: java c

我之前用java编写了一个程序,它接受一个输入字符串作为输入并检查它是否有效。决定的规则是:

1)当且仅当它包含单词“pi”,“ka”,“chu”作为其片段时,该字符串是可识别的,以任何顺序重复任何次数。


2)如果它包含任何其他片段(或子序列),那么它是无法识别的


我能够轻松地在java中这样做,因为java更好地支持字符串函数。我的代码是(这很好)


import java.util.Scanner;
public class RecognisingWords { 
public static void main(String[] args) throws Exception 
{
    Scanner inp= new Scanner(System.in);
    String str;
    System.out.println("Enter the string to be tested:");
    str=inp.nextLine();

    while(str.length()>0)
    {

    if(str.startsWith("pi"))
    {
        str= str.substring(2);          
    }

    else if(str.startsWith("ka"))
    {
        str= str.substring(2);          
    }

    else if(str.startsWith("chu"))
    {
        str= str.substring(3);          
    }

    else
    {
        System.out.println("Unrecognisable Sequence");
        break;
    }

    }

    if(str.length()==0)
    {
        System.out.println("Recognisable Sequence");
    }   
}
}

但是当我在c中编写相应的程序(使用指针)时,我的代码会进入无限循环。请检查我的代码并指出错误是什么。 还可以在不使用指针的情况下实现此程序吗?


#include <stdio.h>
#include <stdlib.h>
#include<string.h>

int main(void)
{
char str[10];
int len=0,flag=1;
char *ptr;

printf("Enter the string : ");
gets(str);
len=strlen(str);
ptr=str;

while(*ptr!='\0')
{
    if(!strcmp("pi",ptr))
    {
        ptr=ptr+2;
    }

    else if(!strcmp("ka",ptr))
    {
        ptr=ptr+2;
    }

    else if(!strcmp("chu",ptr))
    {
        ptr=ptr+3;
    }

    else
    {
        printf("String not recognised");
        flag=0;
        break;
    }
}

if(flag==1)
    printf("String is recognised");

return 0;
}

我纠正了一些非常愚蠢的错误。希望你们不介意

1 个答案:

答案 0 :(得分:1)

您可能希望按ptr += 2ptr += 3推进指针,而不是更改指针指向的字符:*ptr = ...

循环中的逻辑也不正确。你应该循环,直到指针的当前位置指向0(NUL字符 - 这是C中的字符串终结符),while (*ptr != '\0')。您似乎错过了上一个break区块中的else

gets(str)也存在问题,这可能会导致C中出现缓冲区溢出问题。除非您输入超过9个字符的字符串,否则您的程序会出现意外行为。

您的C代码可能存在其他问题,我只能通过观察您的代码来列出。

修改

另一个问题是你使用了strcmp,它会将指针指向的所有内容与片段进行比较。即如果输入是“皮卡丘”,它将“pi”与“皮卡丘”进行比较,并发现“pi”在词法上小于“皮卡丘”,并且它将显示该字符串未被识别。您可能需要strncmp,您可以在其中指定要比较的字符数。