繁体   English   中英

Scanf在单词之间留出空间

[英]Scanf allow space between words

我尝试从文本文件中读取ID为ID,后跟名姓的某些数据,但似乎无法获取scanf来允许该空间。

输入可能类似于:123456 FirstName LastName

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

您可以使用set表示法在名称中指定一组允许的字符,并明确允许使用空格:

scanf("%d %[ a-zA-Z]", &id, fullName);

在这里, []指定允许使用的一组字符(请参见man 3 scanf ),并且在其中有一个空格az ,表示“所有小写字符”,而AZ表示“所有大写字符”。

话虽如此,您应该指定最大宽度,以避免缓冲区溢出。 例如:

char fullName[64]; // allocate 64-byte array and set to 0
scanf("%d %63[ a-zA-Z]", &id, fullName);

注意使用63而不是64; 手册页指出它将先读取指定数量的字符, 然后读取NULL终止符:

字符串输入转换存储一个空终止符('\\ 0')来标记输入的结尾。 最大字段宽度不包括此终结器。

scanf不允许使用空格,您可以使用gets()或最好使用fgets()函数。 获取将整行复制到字符串中,而fgets复制指定的字符数

如果要使用scanf进行操作,请使用%[^ \\ n]而不是%s

有两种方法可以执行此操作:

  • 要读入直到行尾的字符,可以用%[^\\n]类的格式替换%s格式说明符,这只是意味着要读到遇到\\n为止。

  • 另一种方法是在读取int之后使用use fgets()读取字符串。 这具有防止缓冲区溢出的额外好处,因为您必须将要读取的最大字符数传递给fgets()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM