Нужна помощь в понимании этой C программы, которая имитирует strcpy () с помощью функции - PullRequest
0 голосов
/ 28 января 2020

Это мой код. Я пытаюсь смоделировать strcpy (). Этот код работает, но у меня есть пара вопросов.

#include <stdio.h>
#include <stdlib.h>

char *strcpy(char *d, const char *s);

int main()
{
    char strOne[] = "Welcome to the world of programming!";
    char strTwo[] = "Hello world!";
    printf("String One: %s\n", strOne);
    printf("String Two before strcpy(): %s\n", strTwo);
    strcpy(strTwo, strOne);
    printf("String Two after strcpy(): %s\n", strTwo);

    return 0;
}

char *strcpy(char *d, const char *s)
{
   while (*s)
   {
       *d = *s;
       d++;
       s++;
   }
   *d = 0;
   return 0;
}
  1. Когда * s увеличивается до позиции, где '\ 0' хранится в массиве, это когда условие становится ложным из-за '\ 0'? Читает ли while '\ 0' или просто '0'?

  2. , в то время как условие 'true' будет истинным, если оно читает '1'. Все предыдущие значения * s должны читаться как одиночные символы в условии while, но l oop выполняется в любом случае. Почему это происходит? Все ли отдельные символы из массива * s указывают равны значению '1'?

  3. Что именно делает *d = 0;? Насколько я понимаю, процесс копирования завершается при выходе из l oop. Так почему удаление *d = 0 приводит к отображению неверного вывода?

Вывод без *d = 0:

String Two before strcpy(): Hello world!                                                                                       
String Two after strcpy(): Welcome to the world of programming! programming! 

Вывод с *d = 0:

String Two before strcpy(): Hello world!                                                                                       
String Two after strcpy(): Welcome to the world of programming! 

Ответы [ 2 ]

1 голос
/ 28 января 2020

Символы в таблице ASCII принимают значения в диапазоне от 0 до 127, 0 равняется NULL или '\0', поэтому условие всегда истинно, если символ не является '\0'.

*d = 0 помещает '\0' в конец строки; это как строки заканчиваются в C. Если вы не завершите строку, все может быть напечатано после конца строки, и программа не сможет узнать, где она заканчивается. Это неопределенное поведение.

0 голосов
/ 28 января 2020

Еще несколько замечаний. Вы возвращаете 0 вместо указателя на символ. Вы должны получить некоторые предупреждения. Верните копию вместо этого. Кстати, эта функция также может быть немного упрощена.

char *strcpy(char *d, const char *s)
{
   char *saved = d;
   while ((*d++ = *s++));
   return saved;
}
...