0

標準の gcc コンパイラを使用しています。文字列からスペースを削除しようとしています。しかし、次の出力が得られます。ここで何が問題なのですか?out[s2+1] = '\0' を実行しているときは機能していますが、in[s1+1] = '\0' を実行していないのはなぜですか。説明してください。

OUTPUT:
カット後 s1: Ilikerambob
カット後 s2: rambolikeI

int check_anagrams(char *in,char *out)
{
int i=0;
int s1=0,s2=0;
while(in[i]!='\0')
{
    if(in[i]==' ')
    {
        i++;
        in[s1]=in[i];
    }
    in[s1]=in[i];
    i++;
    s1++;
}
in[s1+1]='\0';                         //Not working. Why?
printf("After cutting s1: %s\n",in);
i=0;
while(out[i]!='\0')
{
    if(out[i]==' ')
    {
        i++;
        out[s2]=out[i];
    }
    out[s2]=out[i];
    i++;
    s2++;
}
out[s2+1]='\0';                        //Working. Why?
printf("After cutting s2: %s\n",out);
}

int main()
{
char in[100]="I like rambo";
char out[100]="rambo like I";
int ans;
ans = check_anagrams(in,out);
}
4

1 に答える 1

2

この行は、ほとんどの場合、意図したとおりに動作しません。

in[s1+1]='\0';

\0これにより、位置に文字列終了文字が挿入されますs1+1s1++、ループ内にあるため、この行に到達s1するまでに、文字列の最後に既に到達しています。で置き換えてみてください

in[s1] = '\0';

変数にも同じ問題があります。out出力に表示されないだけです。運が良ければ、出力している余分な文字がスペースだからです。

コードの複製には常に危険が伴います。strip_spaces同じコードを 2 回書くよりも、別のルーチンを作成して 2 回呼び出すことを強くお勧めします。

#include <stdio.h>

void strip_spaces(char *str) {
  int ii = 0, jj = 0;
  while (str[ii]) {
    str[jj] = str[ii];
    if (str[ii++] != ' ')
      ++jj;
  }
  str[jj] = 0;
}

int check_anagrams(char *in,char *out) {
  strip_spaces(in);
  printf("After cutting s1: %s\n",in);
  strip_spaces(out);
  printf("After cutting s2: %s\n",out);
}

int main()
{
  char in[100]="I like rambo";
  char out[100]="rambo like I";
  int ans;
  ans = check_anagrams(in,out);
}
于 2013-11-05T19:54:09.283 に答える