问题描述
因此,我有一个用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' && 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",&record.amount);
// Display the information
printf("\nDonor %s %s gave $%.2f \n",record.lastName,record.amount);
return 0;
}
任何对此的建议将不胜感激。谢谢
一旦我在第一个scanf调用中删除了多余的逗号,它就会起作用。这是已更正的行:
scanf("%s %s",record.lastName);
我在两个%s之间有一个逗号,这是不正确的。
解决方法
或者可以使用受缓冲区溢出保护的fget并使用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 memory\n");
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) && (name[strlen (name) - 1] == '\n'))
name[strlen (name) - 1] = '\0';
//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' && 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",&record.amount);
// Display the information
printf("\nDonor %s %s gave $%.2f \n",record.lastName,record.amount);
free(name);
return 0;
}