#arrays #c #char
#массивы #c #символ
Вопрос:
У меня есть следующий метод
void foo(FILE*, char*, char*);
Я вызываю этот метод из main. Затем я сравниваю значение и хочу, чтобы имя и фамилия были наименьшими из этого значения в методе.
Я прочитал файл из FILE * и хочу изменить / обработать его таким образом, чтобы в итоге я мог выполнить следующее в main.
char* name;
char* sname;
foo(file, name, sname);
printf("nSurname: %snName: %snn", *sname, *name);
Я пробовал memcopy
, strncpy
но в итоге наткнулся на ошибку сегментации.
foo
Выглядит как:
while(fscanf() != EOF)
{
if(certain value is smaller than held value)
{
//update smallest value;
//point to that name and surname to whom smallest value belongs to;
}
}
Извините, если я спрашиваю что-то действительно простое или прямое. Я из C std::string
и теперь борюсь с этим. Любая помощь или предложение будут оценены по достоинству.
Комментарии:
1. Похоже, у вас есть неинициализированные указатели, которые вы пытаетесь разыменовать. Это не сработает — вам нужно сначала заставить их указывать на что-то.
2.
char *
это просто указатель. Он не указывает / ссылается на какую-либо допустимую память, пока вы явно не зададите ему такой допустимый адрес памяти. Есть несколько способов исправить это, но один простой — изменить их на массивы символов :char name[MAX_LEN];
. Имейте в виду, что переполнение буфера необходимо обрабатывать при использовании фиксированных размеров массива, подобных этому.3. И для
printf
%s
спецификатора требуется строка.*sname
является achar
. Поэтому удалите*
.4. Параметр size of
strncpy
обычно используется, чтобы убедиться, что вы не копируете больше символов, чем поместилось бы в целевом массиве. Чтобы сделать это, вам нужно будет передать размер массиваfoo
в дополнение к адресу. Обратите внимание, чтоstrncpy
это не добавляет завершение''
, если исходная строка слишком длинная для указанного размера.5. @tadman Да. Я сделал
char var[W_LENGTH] = { ''}