そのため、特定の文字列の末尾に部分文字列が発生した場合とそうでない場合にstrend
返される基本的な関数を作成して、ポインター/配列を把握しようとしています。char配列の長さを測定し、その長さから部分文字列の長さを差し引いて、そこからプログラムを開始することでこれを達成できることはわかっていますが、より強力な把握を得るために、関数が行う方法でそれを行いたいと思っていますポインター演算の。だからここにプログラムがあります:1
0
#include <stdio.h>
#define NELEMS(x) (sizeof(x) / sizeof(x[0]))
int strend(char *string, char *substring, int substringLength){
int count; /*keep track of how many number of chars that match in a row*/
while(*string != '\0'){
count = 0;
while(*string == *substring){
if (count + 1 == substringLength) return 1; /*if matches = length of str*/
count++;
string ++;
substring ++;
}
if (count == 0) string++; /*only increment outer loop if inner loop has done no work*/
else {
substring - count; /*reset substring, don't increment string... BUGGY*/
}
}
return 0;
}
int main(){
char string[] = "John Coltrane";
char substring[] = "Coltrane";
int substringLength = NELEMS(substring);
printf("%d \n", strend(string, substring, substringLength));
char string2[] = "John Coltrane is Awesome Coltrane";
char substring2[] = "Coltrane";
int substringLength2 = NELEMS(substring);
printf("%d \n", strend(string2, substring2, substringLength2));
return 1;
}
最初のテスト文字列である文字列と部分文字列については、「Coltrane」が文字列の末尾にあるため、正しい結果が得られ、1 が返されます。同様に、string2 から "Coltrane" を取り出すと、正しい結果が得られ、文字列が Coltrane で終わっていないため 0 が返されます。
ただし、上記の string2 のバージョンでは、ゼロも取得されます。問題は、メインの文字列の一部と一致している間、反復してインクリメントした後にstrend
リセットされないという事実にあります。substring
これは、substring の最初のインスタンスが文字列の末尾にある場合は問題ありませんが、string2 のようにインスタンスが 2 つある場合はそうではありません。ポインターを部分文字列配列の先頭に戻すと思いましたsubstring - count
が、そうではないようです。
その式を で変更するとsubstring--
、部分文字列の最後の文字が表示for(int i = 0; i < count; i++, substring--)
されますが、これを行う唯一の方法は のような式ですか?
編集: と置き換えることは、かなりエレガントなワンライナーのようsubstring - count
にfor(; count > 0; count--, substring--)
思えますが、それは私にとってはうまくいきますが、もっと良い方法があると感じています。