gpt4 book ai didi

java - 使用指针验证字符串是否仅由有限的子串集组成

转载 作者:太空宇宙 更新时间:2023-11-04 04:01:28 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

编辑

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

关于java - 使用指针验证字符串是否仅由有限的子串集组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11134649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com