私はウェブで答えを見て、どのようにそのループで動作するのか理解していません。そして、なぜ私はうまくいかないのですか。質問:文字列s1
の各文字を、文字列s2
に一致する文字をすべて削除するsqueeze(s1,s2)
の代替バージョンを作成します。 s1
の各文字は、s2
のすべての文字と一致しないことを確認する必要があります。文字がs1
に表示されているように、s2
をループして、その文字がs1
に一致するかどうかを確認し、s1
の次の文字に移動します。だからs1
の外側ループとs2
の内側ループ。 ここに彼のコードがあります。私はそれをテストするためのコード全体に入れました。彼の出力は正しい。彼のコードは機能の部分です。私が理解していないのは、彼が外側のループにs2
を入れて、それが動作する理由です。Cプログラミング言語の演習2-4:私は答えを理解していません
#include <string.h>
#include <stdio.h>
void squeeze2(char s[], char t[]);
void squeeze2(char s[], char t[]) {
int i, j, k;
for (k = 0; t[k] != '\0'; k++) {
for (i = j = 0; s[i] != '\0'; i++)
if (s[i] != t[k])
s[j++] = s[i];
s[j] = '\0';
}
}
int main() {
char s1[] = "hello meow meow princess";
char s2[] = { 'a', 'e', 'm' };
squeeze2(s1, s2);
int i = 0;
while (s1[i] != '\0') {
printf("%c", s1[i]);
i++;
}
}
そしてtheres mine。それは実際にs2
やあなたの周りには、実際に適応させることを提供する他の方法でs1
と次に最初にあなたのループかどうかは関係ありません
#include <string.h>
#include <stdio.h>
void squeeze(char s1[],char s2[]);
int main() {
char s1[] = "hello meow meow princess";
char s2[] = { 'a', 'e', 'm' };
squeeze(s1, s2);
int l;
for (l = 0; l < strlen(s1); l++)
printf("%c", s1[l]);
}
void squeeze(char s1[], char s2[]) {
int i = 0;
int k = 0;
while (s1[i] != '\0')
for (int j = 0; s2[j] != '\0'; j++) {
if (s1[i] != s2[j]) {
s1[k] = s1[i];
k++;
}
i++;
}
}
さまざまな変数を印刷するための印刷機能を持つコードと、コードフローを注意深く調べます。これは、2つのコードの違いについて、あなたに良い洞察を与えるかもしれません。 – Evert
この状態は 's2 [j]!= '\ 0''が働いているのに驚きました。それから、 '-O3'でコンパイルし、バスエラーで失敗しました。 ''\ 0''はあなたの' s2'文字列に*ない*であるので、あなたはそれを比較してはいけません! (言い換えれば、どちらのバージョンの 'squeeze'も動作しません) – Evert