strcat (); печать дополнительных символов - PullRequest
0 голосов
/ 02 июля 2010

Я сделал функцию strcat () самостоятельно, но после добавления строки она печатает дополнительный символ ascii. Скажите, пожалуйста, почему?

  #include<stdio.h>
  #include<conio.h>
  #include<string.h>
  void xstrcat(char string1[],char string2[]);
  void main(void)
{ char x[100];
  char string1[40],string2[40];
  printf("Enter a string:");
  gets(string1);
  puts("Enter another string:");
  gets(string2);
  xstrcat(string1,string2);
  printf("%s",string1);
  getch();
}
  void xstrcat(char string1[],char string2[])
{
  int i,x,y;
  x=strlen(string1);
  y=strlen(string2);
  for(i=0;i<y;i++)
  { string1[i+x]=string2[i];
  }//for ends
}

Ответы [ 4 ]

4 голосов
/ 02 июля 2010

Ваша xstrcat() функция не помещает нулевой символ-терминатор в конец результирующей строки.

Одним из возможных исправлений может быть добавление следующего кода непосредственно перед возвратом функции xstrcat():

string1[x+y] = '\0';
2 голосов
/ 02 июля 2010

В C строки заканчиваются байтом NUL (символ со значением 0).strlen скажет вам, сколько символов существует от начала строки до байта NUL, не считая самого байта NUL .

Так что при выполнении этого цикла:

for(i=0;i<y;i++)
  { string1[i+x]=string2[i];
  }

Вы никогда не копируете завершающий байт NUL из string2 в string1, и поэтому string1 больше не имеет завершающего NUL (вы переписали его NUL ранее в цикле с первым символом string2).Когда в строке отсутствует завершающий NUL, функции, которые ее читают (например, printf), будут продолжать читать после предполагаемой конечной точки строки, пока в конце концов не найдут байт NUL где-то еще дальше в памяти.Это может привести к печати дополнительных символов и / или падению.

Либо измените y на y+1, либо явно вставьте '\0' в положение x+y в string1.

1 голос
/ 02 июля 2010
void xstrcat(char string1[],char string2[])
{
  //int i,x,y;
  size_t i, x, y;
  // They could also be unsigned, but size_t is an unsigned big enough to hold the
  // biggest in memory index possible

  x=strlen(string1);
  y=strlen(string2);

  //for(i=0;i<y;i++)
  for (i=0; i<=y; i++) // This picks up the null at the end
  { string1[i+x]=string2[i];
  }//for ends
}

В качестве альтернативы вы можете сделать это как:

void xstrcat(char * string1, const char * string2)
{
   while(*string1) {
       string1++;
   }
   strcpy(string1, string2);
}

Это должно быть немного быстрее, потому что не нужно проходить ни одну строку, а один раз. Также не требуется столько дополнительных переменных.

0 голосов
/ 03 июля 2010

ваш цикл

for (i = 0; i < y; i++) {
    string1[i+x]=string2[i];
}

вы читаете строку 2 вплоть до ее длины-1, которая будет считываться только до последнего символа перед NULL, если вы не знаете, в c или c ++ строки заканчиваются на NULL(0) символов.

Таким образом, ваша строка1 не будет иметь нулевого символа в конце.

Так что теперь, когда вы попытаетесь напечатать вашу строку1, она определенно напечатает некоторые символы в конце, так как ваша строка была размером 40, эти символы являются мусором.

В основном вы получите 40 символовВыводится строка, за исключением случаев, когда значение этих мусора равно 0.

Итак, вам следует прочитать вторую строку до 0, поэтому сделайте цикл

for (i = 0; i <= y; i++)

или вы можете просто добавить символ NULLв конце строки 1 после добавления в нее строки 2.

string1[x+y] = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...