是否可以使用 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 函数来打印由 firstNamelastName 分别从用户那里获取的 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,因此您可以先输入并单个输入行上的姓氏。