Запись символов в массиве

Я использую стандартный компилятор gcc. Я пытаюсь удалить пробелы из строки. Но я получаю следующий результат. В чем проблема? Он работает, когда я делаю [s2 + 1] = '\ 0', но почему бы не использовать в [s1 + 1] = '\ 0'. Пожалуйста, объясни.

ВЫВОД: После резки 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);
}
1 ответ

Эта линия почти наверняка не делает то, что вы намереваетесь.

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

Это s1++ символ окончания строки \0 в позиции s1+1, но поскольку у вас есть s1++ в вашем цикле, к моменту достижения этой строки s1 уже находится в конце строки. Попробуйте заменить его на

in[s1] = '\0';

У переменной out есть такая же проблема, вы просто не можете ее увидеть в результате вывода, потому что, по большому счету, дополнительный символ, который он выводит, является пространством.

Всегда существует опасность дублирования кода. Я настоятельно рекомендую написать отдельную процедуру strip_spaces и вызывать ее дважды, вместо того, чтобы писать один и тот же код дважды.

#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);
}
</stdio.h>

licensed under cc by-sa 3.0 with attribution.