#c #struct #io #printf
#c #struct #io #printf
Вопрос:
Итак, у меня есть эта простая программа на C, над которой я работаю, чтобы помочь мне понять структуры. В этом нет ничего слишком сложного. Однако, когда он доходит до точки, где он должен отображать данные, он отображает только часть данных. Программа запрашивает у пользователя имя и фамилию, затем сумму. Тогда в нем должны отображаться имя и фамилия, а также сумма. Он не отображает фамилию. Я уверен, что это, вероятно, что-то простое, но я не уверен, чего мне здесь не хватает.
Вот код:
#include <stdio.h>
#include <stdlib.h>
#define NAMESIZE 30
struct data{
float amount;
char firstName[NAMESIZE];
char lastName [NAMESIZE];
}record;
int main()
{
printf("nEnter the donor's first and last names n");
printf("Separate names by a space: ");
scanf("%s, %s", record.firstName, record.lastName);
char c;
while ( (c = getchar()) != 'n' amp;amp; c != EOF )
{
}
// At this point the program does not work correctly
// It will just print the first name not the last name
printf("nEnter the donation amount: ");
scanf("%f", amp;record.amount);
// Display the information
printf("nDonor %s %s gave $%.2f n", record.firstName, record.lastName, record.amount);
return 0;
}
Любые предложения по этому поводу были бы с благодарностью приняты. Спасибо
Как только я избавился от лишней запятой в первом вызове scanf, это сработало. Вот строка, которая была исправлена:
scanf("%s %s", record.firstName, record.lastName);
У меня была запятая между двумя% s, и это было неверно.
Комментарии:
1. Всегда проверяйте возвращаемое значение
scanf.
В коде, вprintf
котором указано «Разделять имена пробелом», но вscanf
есть запятая. Каков фактический ввод?2. 1) Загляните в свой отладчик, чтобы узнать, есть ли у вас фамилия. Вы используете отладчик, верно? 2) Проверьте возвращаемое значение (например,
iret = scanf()
, чтобы убедиться, что прочитанный # / items равен «2». Проверка возвращаемых значений — это хорошо 🙂 3) Избавьтесь от запятой: измените наiret = scanf("%s %s", record.firstName, record.lastName);
3.
scanf("%s, %s", <...>);
—>scanf("%s %s", <...>);
4. Я думал, что запятая должна быть там, чтобы scanf работал должным образом?
5. Спасибо paulsm4 и пользователю 12986714, как только я внес это изменение, оно сработало так, как должно, спасибо, что указали на мою простую ошибку.
Ответ №1:
Или, может быть, можно использовать fgets, защищенные от переполнения буфера, и использовать strtok для разделения интервала
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NAMESIZE 30
struct data{
float amount;
char firstName[NAMESIZE];
char lastName [NAMESIZE];
}record;
int main()
{
char *name = malloc(NAMESIZE);
if (name == NULL) {
printf("No memoryn");
return 1;
}
printf("nEnter the donor's first and last names n");
printf("Separate names by a space: ");
//scanf("%s, %s", record.firstName, record.lastName);
fgets(name, NAMESIZE, stdin);
if ((strlen(name) > 0) amp;amp; (name[strlen (name) - 1] == 'n'))
name[strlen (name) - 1] = '';
//split name
int init_size = strlen(name);
char delim[] = " ";
char *ptr = strtok(name, delim);
int idx = 0;
while(ptr != NULL)
{
printf("%d '%s'n",idx, ptr);
if(idx == 0){
strcpy(record.firstName, ptr);
}
else{
strcpy(record.lastName, ptr);
}
ptr = strtok(NULL, delim);
idx = 1;
}
/*
char c;
while ( (c = getchar()) != 'n' amp;amp; c != EOF )
{
}
*/
// At this point the program does not work correctly
// It will just print the first name not the last name
printf("nEnter the donation amount: ");
scanf("%f", amp;record.amount);
// Display the information
printf("nDonor %s %s gave $%.2f n", record.firstName, record.lastName, record.amount);
free(name);
return 0;
}