来自man gets:
永远不要使用gets().因为在不事先知道数据的情况下无法判断get()将读取多少个字符,并且因为gets()将继续存储超出缓冲区末尾的字符,所以使用它是非常危险的.它已被用来打破计算机安全.请改用fgets().
几乎无处不在我看到scanf的应该有同样的问题(一个方式使用缓冲区溢出/缓冲区溢出)scanf("%s",string).这种情况存在这个问题吗?为什么scanf手册页中没有关于它的引用?为什么gcc在编译时不会发出警告-Wall?
ps:我知道有一种方法可以在格式字符串中指定字符串的最大长度scanf:
char str[10];
scanf("%9s",str);
Run Code Online (Sandbox Code Playgroud)
编辑:我不是要求确定前面的代码是否正确.我的问题是:如果scanf("%s",string)总是错的,为什么没有警告,手册页中没有任何关于它的内容?
我想知道为什么当我试图获得不同的输入时它忽略了我的第二个输入.
#!/usr/bin/env ruby
#-----Class Definitions----
class Animal
attr_accessor :type, :weight
end
class Dog < Animal
attr_accessor :name
def speak
puts "Woof!"
end
end
#-------------------------------
puts
puts "Hello World!"
puts
new_dog = Dog.new
print "What is the dog's new name? "
name = gets
puts
print "Would you like #{name} to speak? (y or n) "
speak_or_no = gets
while speak_or_no == 'y'
puts
puts new_dog.speak
puts
puts "Would you like #{name} to speak again? (y or n) "
speak_or_no = …Run Code Online (Sandbox Code Playgroud) 我正在运行一个循环,我在其中使用"gets.chomp"命令等待用户响应.如何将其与睡眠/计时器命令结合使用?
例如.我希望它等待1分钟让用户输入一个单词,否则它将继续返回循环.
每个C程序员都知道gets除非标准输入连接到可信源,否则无法安全使用.但是为什么C的开发人员在成为C标准的正式部分之前没有注意到这样一个明显的错误?为什么要在C11中将其从标准中删除并用一个执行边界检查的函数替换它?我知道fgets它通常用于它的位置,但这有一个令人讨厌的习惯,就是保持\n最后的状态.
是否有一些简单的方法如何在提供默认值的同时在 Ruby 中请求用户输入?
考虑 bash 中的这段代码:
function ask_q {
local PROMPT="$1"
local DEF_V="$2"
read -e -p "$PROMPT" -i "$DEF_V" REPLY
echo $REPLY
}
TEST=$(ask_q "Are you hungry?" "Yes")
echo "Answer was \"$TEST\"."
Run Code Online (Sandbox Code Playgroud)
你能用 Ruby 实现类似的行为gets.chomp吗?
function ask_q(prompt, default="")
puts prompt
reply = gets.chomp() # ???
return reply
def
reply = ask_q("Are you hungry?", "Yes")
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过这种方式对 Ruby 中的功能进行排序复制......
def ask_q(prompt, default="")
default_msg = (default.to_s.empty?) ? "" : "[default: \"#{default}\"]"
puts "${prompt} ${default}"
reply = gets.chomp()
reply = (default.to_s.empty?) ? …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个程序,要求用户gets.chomp在三秒钟内回答问题,否则答案将自动返回false.
我想出除了超时部分以外的一切,我想知道是否有人可以请求帮助.
我需要.js在带有spidermonkey的控制台中运行一个用户输入,如下所示:
$ js myprogram.js
什么是相当于Ruby的JavaScript gets?
我遇到了问题gets.
目的是从用户那里获得输入,直到他点击'Enter'.
这是代码:
struct LinkedListNode* executeSection2()
{
char inputArr [3] = {'\0'};
struct LinkedListNode* newNode;
struct LinkedListNode* head = NULL;
gets (inputArr);
while (inputArr[0] != 0) // The user didn't press "Enter"
{
newNode=newLinkedListNode();
newNode->tree=newHuffmanNode(inputArr[0],atoi(inputArr+2));
head = addNode(&head, newNode);
gets (inputArr);
}
head = buildHuffmanTree(&head);
return head;
}
Run Code Online (Sandbox Code Playgroud)
似乎没问题,用户点击'Enter',代码从while出来,但在返回后,我收到错误信息:
变量'inputArr'周围的堆栈已损坏
我想我没有正确读取键盘输入.我会为一些指导感到高兴.
谢谢.
我的 Ruby 脚本类似于:
something = gets # or STDIN.gets
puts something
def arrow_pressed
puts "arrow totally pressed"
end
Run Code Online (Sandbox Code Playgroud)
一旦用户提示存在,我希望除箭头键之外的所有键盘输入正常发生。如果按下这些按钮,我不希望终端中出现任何内容(例如^[[A)。我只想执行我的arrow_pressed方法。我想执行它而不需要用户点击Return
我已经尝试过这个要点- 效果很好,只是即使在更改它以正常地通过大多数击键之后,我仍然无法Backspace(或其他特殊功能)工作。
我很高兴使用gets(图书馆或其他什么)以外的东西。任何帮助,将不胜感激!