我之前用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;
}
我纠正了一些非常愚蠢的错误。希望你们不介意
答案 0 :(得分:1)
您可能希望按ptr += 2
或ptr += 3
推进指针,而不是更改指针指向的字符:*ptr = ...
。
循环中的逻辑也不正确。你应该循环,直到指针的当前位置指向0(NUL字符 - 这是C中的字符串终结符),while (*ptr != '\0')
。您似乎错过了上一个break
区块中的else
。
gets(str)
也存在问题,这可能会导致C中出现缓冲区溢出问题。除非您输入超过9个字符的字符串,否则您的程序会出现意外行为。
您的C代码可能存在其他问题,我只能通过观察您的代码来列出。
修改
另一个问题是你使用了strcmp
,它会将指针指向的所有内容与片段进行比较。即如果输入是“皮卡丘”,它将“pi”与“皮卡丘”进行比较,并发现“pi”在词法上小于“皮卡丘”,并且它将显示该字符串未被识别。您可能需要strncmp
,您可以在其中指定要比较的字符数。