Обновление строки с помощью функции в c

#arrays #c #c-strings #string-literals #strcpy

Вопрос:

Я написал следующий код на c для обновления массива символов rb, но он печатает значение мусора

 #include <stdio.h>
void update(char* buff){
    char word[] = "HII_O";
    buff = word;
    return;
}

int main(){
    char rb[6];
    update(rb);
    rb[5] = '';
    printf("[%s]n",rb);
    return 0;
}
 

Ограничение в том, что мы не можем использовать какую-либо другую библиотеку. Итак, как решить эту проблему

Комментарии:

1. buff = word -> strcpy(buf, word) . В настоящее время вы изменяете только локальный параметр.

2. @mediocrevegetable1, но для этого потребуется строка.h

3. Создать свою собственную strcpy функцию довольно просто. Вам просто нужно будет поместить for цикл на его место и копировать word buff его символ за символом.

4. buff[0] = word[0]; buf[1] = word[1]; и т.д. Сделайте это в цикле.

5. @kaylum понял,

Ответ №1:

Внутри функции update параметр buff является локальной переменной функции, которая не будет активна после выхода из функции.

Вы можете представить вызов функции следующим образом

 update( rb );
//...
void update( /*char* buff*/){
    char *buff = rb;
    char word[] = "HII_O";
    buff = word;
    return;
}
 

Как вы видите, исходный массив не был изменен.

То есть сначала указатель buff был инициализирован адресом первого элемента исходного массива rb .

     char *buff = rb;
 

а затем этот указатель был переназначен с адресом первого элемента локального массива символов word

     buff = word;
 

Что вам нужно, так это скопировать символы строкового литерала "HII_O" в исходный массив rb с помощью стандартной строковой функции strcpy или strncpy .

Например

 #include <string.h>
#include <stdio.h>

void update(char* buff){
    strcpy( buff, "HII_O" );
}

int main(){
    char rb[6];
    update(rb);
    printf("[%s]n",rb);
    return 0;
}
 

Ответ №2:

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

 void update( /*char* buff*/){
    char *buff = rb;
    char word[] = "HII_O";
    buff = word;
    return;
}
 

(вы не можете назначать массивы в целом в C)
в:

 void update(char *buff) {
    char *word = "HII_O";
    int index;
    /* copy characters, one by one, until character is '' */
    for (index = 0; word[index] != ''; index = index   1) {
        buff[index] = word[index];
    }
    /* index ended pointing to the next character, so we can
     * do the next assignment. */
    buff[index] = ''; /* ...and copy also the '' */
}
 

Ответ №3:

buff является локальной переменной для функции. Он инициализируется для указания на первый элемент rb массива в main , но изменения в buff не изменят rb массив. Так

 buff = word;
 

buff указывает на строковый литерал "HII_O" , но rb массив не изменяется.

Нормальным решением было бы

 void update(char* buff){
    strcpy(buff, "HII_O");
}
 

Однако вы пишете …

Ограничение в том, что мы не можем использовать какую-либо другую библиотеку.

Ну, для того, чтобы установить фиксированное значение, как это делает ваш код, вам не нужна никакая библиотечная функция.

Вам не нужны другие переменные, строковые литералы и т. Д.

Просто простые задания персонажей, такие как:

 void update(char* buff){
    buff[0] = 'H';
    buff[1] = 'I';
    buff[2] = 'I';
    buff[3] = '_';
    buff[4] = 'O';
    buff[5] = '';
}

int main(){
    char rb[6];
    update(rb);
    printf("[%s]n",rb);
    return 0;
}
 

Комментарии:

1. strcpy(rb, "HII_O"); . Я думаю, что здесь нам нужно использовать strcpy(buff, "HII_O"); . Потому rb что внутри этой функции нет никакой области действия.

2. @VishnuCS Это была опечатка. Теперь исправлено. Спасибо.