我尝试读取一些带有id的数据,后跟来自文本文件的firstname lastname,我似乎无法获得scanf以允许空间.
输入可能如下所示:123456 FirstName LastName
scanf("%d%s", &id, fullName)
不起作用,因为它切断了名字和姓氏之间的空格.我想在一个字符串中有"第一个最后一个"(最好没有concat,因为有些情况下不包括姓氏).
您可以使用set notation在名称中指定一组允许的字符,并明确允许空格:
scanf("%d %[ a-zA-Z]", &id, fullName);
Run Code Online (Sandbox Code Playgroud)
这里,[]
指定一组允许的字符(参见man 3 scanf),其中有一个空格,a-z
表示"所有小写字符" A-Z
,表示"所有大写字符".
总而言之,您应该指定最大宽度,以避免溢出缓冲区.例如:
char fullName[64]; // allocate 64-byte array and set to 0
scanf("%d %63[ a-zA-Z]", &id, fullName);
Run Code Online (Sandbox Code Playgroud)
注意使用63而不是64; 手册页指出它将读取指定的字符数,然后是NULL终止符:
字符串输入转换存储空终止符('\ 0')以标记输入的结尾; 最大字段宽度不包括此终止符.