C 是否可以使用FGET将单行中的用户输入存储到2个数组中?
我正在尝试将用户输入的名称存储到结构中。我使用的是C 是否可以使用FGET将单行中的用户输入存储到2个数组中?,c,struct,scanf,fgets,c-strings,C,Struct,Scanf,Fgets,C Strings,我正在尝试将用户输入的名称存储到结构中。我使用的是fgets而不是scanf,因为我想控制用户输入的长度。是否可以使用fgets将用户输入从由空格分隔的单行存储到两个数组中(对于我的情况,是lastName[10]和firstName[10]) 是否只有使用printf函数才能分别打印firstName和lastName从用户处获取的两个字符串 #include <stdio.h> #include <string.h> struct names { char
fgets
而不是scanf
,因为我想控制用户输入的长度。是否可以使用fgets
将用户输入从由空格分隔的单行存储到两个数组中(对于我的情况,是lastName[10]
和firstName[10]
)
是否只有使用printf
函数才能分别打印firstName
和lastName
从用户处获取的两个字符串
#include <stdio.h>
#include <string.h>
struct names {
char lastName[10];
char firstName[10];
} names;
int main() {
printf("Enter names (firstName lastName): \n");
fgets(names.firstName, 10, stdin);
fgets(names.lastName, 10, stdin);
printf("first Name: %s last Name: %s \n", names.firstName, names.lastName);
return 0;
}
#包括
#包括
结构名称{
char lastName[10];
charfirstname[10];
}姓名;
int main(){
printf(“输入名称(firstName lastName):\n”);
fgets(姓名、姓氏、10、标准名称);
fgets(names.lastName,10,stdin);
printf(“名字:%s姓氏:%s\n”,names.firstName,names.lastName);
返回0;
}
例如,您可以声明字符数组
char line[20];
(数组的大小可以大于20)并读取此字符数组中的数据
fgets( line, sizeof( line ), stdin );
当您可以使用函数sscanf读取lastName和firstName时,如
sscanf( line, "%s %s", names.firstName, names.lastName );
另外,通过确定
行中空白的位置,可以确定每个子字符串不超过9个字符。stdio.h中的标准C函数的问题是,它们很容易出错,从而导致缓冲区溢出。以下是使用自定义函数读取名称的安全方法:
#include <ctype.h>
#include <stdio.h>
#define LEN(arr) (sizeof (arr) / sizeof (arr)[0])
struct names {
char lastName[10];
char firstName[10];
} names;
void ReadName(char name[], int nameLen)
{
int ch, i;
/*skip whitespace*/
do {
ch = getchar();
} while (isspace(ch));
i = 0;
while ((isgraph(ch) || ((unsigned char) ch >= 128)) && (i < nameLen - 1)) { /*accept any UTF-8 byte*/
name[i] = ch;
i++;
ch = getchar();
}
name[i] = '\0';
}
int main(void)
{
printf("Enter names (first name last name): \n");
ReadName(names.firstName, LEN(names.firstName));
ReadName(names.lastName, LEN(names.lastName));
printf("First name: %s\nLast name: %s\n", names.firstName, names.lastName);
return 0;
}
#包括
#包括
#定义LEN(arr)(sizeof(arr)/sizeof(arr)[0])
结构名称{
char lastName[10];
charfirstname[10];
}姓名;
void ReadName(字符名[],整数名)
{
int ch,i;
/*跳过空白*/
做{
ch=getchar();
}while(isspace(ch));
i=0;
而((isgraph(ch)| |((unsigned char)ch>=128))&&(i
编辑:使ReadName接受UTF-8字符。实际上,使用scanf可以更好地完成您尝试执行的操作(包括控制用户输入的长度):
scanf("%9s %9s",names.firstName,names.lastName);
“%9s”将每个字符串限制为9个字符(以避免字符串溢出),并且字符串格式中的空格会扫描空白,因此您可以在单个输入行中输入姓名。不能单独输入。它将一直读取,直到看到一个换行符,然后需要解析字符串以将其拆分为两个结构成员。@Ryker谢谢。这是一个输入错误。对不起,但是sscanf代码行是如何工作的?%s之间的空格是否将字符串分隔,以便输入到正确的结构中?如果firstName或lastName的长度发生变化,您希望行的长度随之变化,而此解决方案并非如此。