是否可以使用 fgets 将单行的用户输入存储到 2 个数组中?
is it possible to use fgets to store the userinput from a single line into 2 arrays?
我正在尝试将用户输入的名称存储到结构中。我使用 fgets
而不是 scanf
因为我想控制用户输入的长度。是否可以使用 fgets
将用户输入从由白色 space 分隔的单行存储到 2 个数组中(对于我来说是 lastName[10]
和 firstName[10]
)?
是使用 printf
函数来打印由 firstName
和 lastName
分别从用户那里获取的 2 个字符串的唯一方法吗?
#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 line[20];
(数组大小可以大于20)并读取此字符数组中的数据
fgets( line, sizeof( line ), stdin );
何时可以使用函数 sscanf 读取 lastName 和 firstName,例如
sscanf( line, "%s %s", names.firstName, names.lastName );
同样通过判断line
中空格的位置可以判断每个子串不超过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] = '[=10=]';
}
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;
}
编辑:使 ReadName 接受 UTF-8 字符。
实际上,您尝试做的事情(包括控制用户输入的长度)更好使用 scanf:
完成
scanf("%9s %9s",names.firstName,names.lastName);
"%9s" 将每个字符串限制为 9 个字符(以避免溢出您的字符串),格式字符串中的 space 扫描白色 space,因此您可以先输入并单个输入行上的姓氏。
我正在尝试将用户输入的名称存储到结构中。我使用 fgets
而不是 scanf
因为我想控制用户输入的长度。是否可以使用 fgets
将用户输入从由白色 space 分隔的单行存储到 2 个数组中(对于我来说是 lastName[10]
和 firstName[10]
)?
是使用 printf
函数来打印由 firstName
和 lastName
分别从用户那里获取的 2 个字符串的唯一方法吗?
#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 line[20];
(数组大小可以大于20)并读取此字符数组中的数据
fgets( line, sizeof( line ), stdin );
何时可以使用函数 sscanf 读取 lastName 和 firstName,例如
sscanf( line, "%s %s", names.firstName, names.lastName );
同样通过判断line
中空格的位置可以判断每个子串不超过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] = '[=10=]';
}
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;
}
编辑:使 ReadName 接受 UTF-8 字符。
实际上,您尝试做的事情(包括控制用户输入的长度)更好使用 scanf:
完成scanf("%9s %9s",names.firstName,names.lastName);
"%9s" 将每个字符串限制为 9 个字符(以避免溢出您的字符串),格式字符串中的 space 扫描白色 space,因此您可以先输入并单个输入行上的姓氏。