Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否可以使用FGET将单行中的用户输入存储到2个数组中?_C_Struct_Scanf_Fgets_C Strings - Fatal编程技术网

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的长度发生变化,您希望行的长度随之变化,而此解决方案并非如此。