Scanf允许单词之间的空格

时间:2012-02-24 20:57:28

标签: c

我尝试读取一些带有id的数据,后跟来自文本文件的firstname lastname,我似乎无法获得scanf以允许空间。

输入可能如下所示: 123456 FirstName LastName

scanf("%d%s", &id, fullName)不起作用,因为它会切断名字和姓氏之间的空格。我想在一个字符串中使用“first last”(最好没有concat,因为有些情况下不包含姓氏)。

3 个答案:

答案 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()传递给要读取的最大字符数。