#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 Это была опечатка. Теперь исправлено. Спасибо.