服用newline后,未终止scanf()或get()
我必须在一个字符串中进行三个输入。
要接受输入的代码是:
char msg_send[1000];
gets(msg_send);
输入就像
,
GET /api HTTP/1.1
id=1&name=phoenix&[email protected]
这意味着拳头行之后有一个newline get/api http/1.1
。下一行是一个空的新线。输入功能应在获得第三个新线后终止。
另外,如果该行在的位置上没有
word。/api
Word,我必须在第一行get/http/1.1
之后终止输入。 /某物
但是,当我使用get get()时,它在服用get/api http/1.1
一部分输入后终止字符串。使用SCANF时,它仅在第一个get
Word中终止。有什么方法可以将输入作为一个字符串?
I have to take three inputs in a single string.
The code to take the input is:
char msg_send[1000];
gets(msg_send);
The input is like
GET /api HTTP/1.1
id=1&name=phoenix&[email protected]
That means there is a newline after the fist line GET /api HTTP/1.1
. The next line is an empty newline. The input taking function should terminate after taking the 3rd newline.
Also, I have to terminate the input after the first line GET /something HTTP/1.1
if the line doesn't have a /api
word at the place of /something
word.
But when I'm using gets(), it terminates the string after taking GET /api HTTP/1.1
part of the input. When using scanf, it terminates after taking only the first GET
word. Is there any way to take the input as a single string?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
从
file *
中读取应使用fgets()
,而不是get> get> get> get> get()
无法安全使用。适当的URL的测试应严格:strstr(msg_send,“/api”)
不够:get/sosings/sosings/api
将匹配。将请求与get/api http/1.1
进行比较,或者可能省略/1.1
似乎更安全。这是一个修改版本:
Reading from the
FILE *
should be done withfgets()
, notgets()
which cannot be used safely. Testing for the proper URL should be strict:strstr(msg_send, "/api")
is not sufficient:GET /something/api
will match. Comparing the request toGET /api HTTP/1.1
or possibly omitting the/1.1
seems safer.Here is a modified version:
在这种情况下,您应该只在循环中使用getchar:
first_line_valid
函数可能看起来像这样(注意:需要#include< stdbool.h>
for bool类型):In cases like these, you should just use getchar in a loop:
The
first_line_valid
function might look like this (note: needs#include <stdbool.h>
for bool type):因此,我想出了答案。
答案是,如果命令中的
/api
,我应该使用条件。该代码就像:
我应该将第一部分作为字符串作为字符串,然后判断它是否具有
/api
。如果不包含,则输入应结束。感谢大家的有用意见。So, I figured out the answer.
The answer is I should use a condition if there is
/api
in the command.The code is like:
I should take the first part as a string and then judge if it has the word
/api
. If it doesn't contain, the input taking should end. Thanks to everyone for your useful opinions.