![](/img/trans.png)
[英]distinguishing between a string and an int in scanf when there is no space
[英]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.