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 += 2またはでポインターを進めたいと思うでしょう: .ptr += 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 に答える