我尝试读取一些带有id的数据,后跟来自文本文件的firstname lastname,我似乎无法获得scanf以允许空间。
输入可能如下所示: 123456 FirstName LastName
scanf("%d%s", &id, fullName)
不起作用,因为它会切断名字和姓氏之间的空格。我想在一个字符串中使用“first last”(最好没有concat,因为有些情况下不包含姓氏)。
答案 0 :(得分:5)
您可以使用set notation在名称中指定一组允许的字符,并明确允许空格:
scanf("%d %[ a-zA-Z]", &id, fullName);
此处,[]
指定了一组允许的字符(请参阅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);
注意使用63而不是64;手册页指出它将读取指定的字符数,然后一个NULL终结符:
字符串输入转换存储空终止符('\ 0')以标记输入的结尾;最大字段宽度不包括此终结符。
答案 1 :(得分:3)
scanf不允许空格 你可以使用gets()或最好是fgets()函数。 将整行复制到字符串中 而fgets复制指定的字符数
如果你想用scanf使用%[^ \ n]代替%s
答案 2 :(得分:1)
有几种方法可以做到这一点:
要读取直到行尾的字符,您可以将格式说明符%s
替换为类似%[^\n]
的格式说明符,这只是意味着在\n
之前阅读遇到了。
另一种方法是在您阅读fgets()
后使用int
来阅读字符串。这具有防止缓冲区溢出的额外好处,因为您必须将fgets()
传递给要读取的最大字符数。