Использование указателей в качестве параметров в функции strcpy.Пытаясь понять код из книги - PullRequest
2 голосов
/ 30 марта 2019

Из моей книги:

void strcpy (char *s, char *t)
{
int i=0;
while ((s[i] = t[i]) != ’\0’)
++i;
}

Я пытаюсь понять этот фрагмент кода из моего учебника. Они не дают основной функции, поэтому я пытаюсь понять, как параметры будут использоваться при вызове функции. Насколько я понимаю, «i-число» символов строки t [] копируется в строку s [] до тех пор, пока не останется символов для чтения из escape-последовательности \ 0. Я не очень понимаю, как параметры будут определены за пределами функции. Любая помощь очень ценится. Спасибо.

Ответы [ 3 ]

2 голосов
/ 30 марта 2019

Здесь нужно запомнить две вещи:

  • Строки в C являются массивами char s
  • Массивы передаются в функции в качестве указателей

Так вы бы назвали это так:

char destination[16];
char source[] = "Hello world!";

strcpy(destination, source);
printf("%s", destination);

i - это просто внутренняя переменная, она не имеет значения вне функции strcpy (это не параметр или что-то в этом роде). Эта функция копирует всю строку t в s и останавливается, когда видит символ \0 (который обозначает конец строки в соответствии с соглашением C).

РЕДАКТИРОВАТЬ: Кроме того, strcpy является стандартной библиотечной функцией, поэтому могут произойти странные вещи, если вы попытаетесь переопределить ее. Дайте вашей копии новое имя, и все будет хорошо.

0 голосов
/ 30 марта 2019

Вот как вы можете использовать функцию (обратите внимание, что вы должны изменить имя функции, так как оно будет конфликтовать со стандартной библиотекой)

void my_strcpy (char *s, char *t)
{
    int i=0; 
    while ((s[i] = t[i]) != ’\0’)
    ++i;
}

int main()
{
    char *dataToCopy = "This is the data to copy";
    char buffer[81];   // This buffer should be at least big enough to hold the data from the 
                       // source string (dataToCopy) plus 1 for the null terminator

    // call your strcpy function
    my_strcpy(buffer, dataToCopy);

    printf("%s", buffer);
}

В коде переменная i указывает на символ в массиве символов. Поэтому, когда i равно 0, вы указываете на первый символ s и t. s[i] = t[i] копирует i-й символ из t в i-й символ s. Это присваивание в C является само выражением и возвращает скопированный символ, что позволяет сравнить его с нулевым терминатором 0 т.е. (s[i] = t[i]) != ’\0’, который указывает конец строки, если скопированный символ не является нулевым терминатором, цикл продолжается, иначе он закончится.

0 голосов
/ 30 марта 2019

Вот тебе главное:

int main()
{
    char buf[30];
     strcpy(buf, "Hi!");
     puts(buf);
     strcpy(buf, "Hello there.");
     puts(buf);
}

Смысл s и t состоит в том, чтобы принимать символьные массивы, которые существуют в других местах программы. Они определяются в другом месте, на этом уровне, как правило, непосредственным абонентом или еще одним абонентом, указанным выше. Их значения заменяются во время выполнения.

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

const strcpy (char *s, const char *t)
{
     ...
     return s;
  }

Где const означает, что не будет изменяться. Поскольку strcpy является стандартной функцией, вам действительно нужно, чтобы она была правильной.

...