1

我之前用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;
}

我已经纠正了我的一些非常愚蠢的错误。希望大家不要介意

4

1 回答 1

1

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

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

也有问题gets(str),这可能会导致 C 中的缓冲区溢出问题。抛开安全问题不谈,如果您输入的字符串长度超过 9 个字符,您的程序将出现意外行为。

您的 C 代码可能存在其他问题,我无法仅通过观察您的代码来列出这些问题。

编辑

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

于 2012-06-21T08:58:29.047 回答