Я написал следующий код 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] = '\0';
    printf("[%s]\n",rb);
    return 0;
}

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

3
ancad ancad 18 Сен 2021 в 09:29

2 ответа

Лучший ответ

В функции 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;
}
0
Vlad from Moscow 18 Сен 2021 в 07:23

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

buff = word;

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

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

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

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

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

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

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

Простые назначения символов, например:

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

int main(){
    char rb[6];
    update(rb);
    printf("[%s]\n",rb);
    return 0;
}
0
4386427 18 Сен 2021 в 07:15