当我尝试编译使用gets()GCC函数的C代码时,
我明白了
警告:
(.text + 0x34):警告:`gets'函数很危险,不应该使用.
我记得这与堆栈保护和安全性有关,但我不确定为什么?
有人可以帮我删除这个警告并解释为什么会有这样的使用警告gets()?
如果gets()是如此危险,为什么我们不能删除它?
Coderbyte是一个在线编码挑战网站(我在2分钟前找到了它)。
您遇到的第一个C ++挑战有一个您需要修改的C ++框架:
Run Code Online (Sandbox Code Playgroud)#include <iostream> #include <string> using namespace std; int FirstFactorial(int num) { // Code goes here return num; } int main() { // Keep this function call here cout << FirstFactorial(gets(stdin)); return 0; }
如果你稍微熟悉C ++的第一件事*在你的眼睛持久性有机污染物是:
int FirstFactorial(int num);
cout << FirstFactorial(gets(stdin));
Run Code Online (Sandbox Code Playgroud)
因此,好的,代码调用gets从C ++ 11开始不推荐使用,而从C ++ 14开始删除,这本身就是不好的。
但后来我意识到:gets是类型char*(char*)。因此,它不应该接受FILE*参数,并且结果不能代替int参数使用,但是...不仅可以编译时没有任何警告或错误,而且可以运行并将实际的正确输入值传递给FirstFactorial。
在此特定站点之外,代码无法编译(如预期的那样),那么这里发生了什么?
*实际上第一个是,using namespace std但这与我在这里的问题无关。
我一直在做一个相当简单的程序,将一串字符(假设输入数字)转换为整数.
我改完之后,我注意到一些非常奇特的"错误",我不能回答大多是因我有限的知识如何,scanf(),gets()和fgets()职能的工作.(尽管我读过很多文学作品.)
所以没有写太多文本,这里是程序的代码:
#include <stdio.h>
#define MAX 100
int CharToInt(const char *);
int main()
{
char str[MAX];
printf(" Enter some numbers (no spaces): ");
gets(str);
// fgets(str, sizeof(str), stdin);
// scanf("%s", str);
printf(" Entered number is: %d\n", CharToInt(str));
return 0;
}
int CharToInt(const char *s)
{
int i, result, temp;
result = 0;
i = 0;
while(*(s+i) != '\0')
{
temp = *(s+i) & 15;
result = (temp + result) * 10;
i++;
} …Run Code Online (Sandbox Code Playgroud) 我想从标准输入中读取整行,包括两个单词之间的空格.
当使用get on gcc时,我收到以下消息:
send.c:(.text+0x2a): warning: the `gets' function is dangerous and should not be used.
Run Code Online (Sandbox Code Playgroud)
什么是更好的选择?
我正在使用gets暂停脚本的输出,直到用户点击回车键.如果我没有将任何参数传递给我的脚本,那么它可以正常工作.但是,如果我将任何参数传递给我的脚本,则会因以下错误而死亡:
ruby main.rb -i
main.rb:74:in `gets': No such file or directory - -i (Errno::ENOENT)
from main.rb:74:in `gets'
...
Run Code Online (Sandbox Code Playgroud)
错误消息显示我传递给脚本的参数.为什么会看到ARGV?
我正在使用OptionParser来解析我的命令行参数.如果我使用parse!而不是parse(因此它删除它从参数列表中解析的东西),那么应用程序工作正常.
所以看起来像是因为某种原因读取了ARGV.为什么?这是预期的吗?有没有办法让它不这样做(做gets()没有帮助).
该gets()功能已从C语言中删除.标准中不存在此类功能.
然而,我编译以下代码:
#include <stdio.h>
int main (void)
{
(void) gets (NULL);
}
Run Code Online (Sandbox Code Playgroud)
运用
gcc -std=c11 -pedantic-errors -Wall -Wextra
Run Code Online (Sandbox Code Playgroud)
它编译时没有给出任何错误或警告.同样的,
#include <stdio.h>
int gets;
int main (void)
{}
Run Code Online (Sandbox Code Playgroud)
不会编译(错误:'获得'重新声明为不同类型的符号).
在标准4.一致性§6中,我们可以阅读:
符合实现的实现可能具有扩展(包括附加库函数),前提是它们不会改变任何严格符合程序的行为
鉴于上述情况,我认为即使在迂腐模式下,gcc也不符合标准.是否有一个原因?这是故意还是错误?
GCC版本4.9.1.
编辑:
gcc --version
gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.1
Run Code Online (Sandbox Code Playgroud) 使用IRB,我想输入一个多行字符串,以便从中删除某些字符."gets"只允许一行 - 对于多行是否有类似的功能.
ASCII_project.rb(main):002:0* puts = "What's the text you want to strip?"
=> "What's the text you want to strip?"
ASCII_project.rb(main):003:0> str = gets
Run Code Online (Sandbox Code Playgroud)
我现在想要粘贴一段文本 - 由于新行不起作用.这就是我想收集多行的原因
这是代码
# encoding: CP850
puts = "What's the text you want to strip?"
str = gets
str.gsub!(/\P{ASCII}/, '')
puts str
Run Code Online (Sandbox Code Playgroud) 我是C的新手,我在向程序输入数据时遇到了问题.
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int a;
char b[20];
printf("Input your ID: ");
scanf("%d", &a);
printf("Input your name: ");
gets(b);
printf("---------");
printf("Name: %s", b);
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它允许输入ID,但它只是跳过其余的输入.如果我改变这样的顺序:
printf("Input your name: ");
gets(b);
printf("Input your ID: ");
scanf("%d", &a);
Run Code Online (Sandbox Code Playgroud)
它会工作.虽然,我不能改变秩序,我需要它原样.有人能帮我吗 ?也许我需要使用其他一些功能.谢谢!
如果代码是
scanf("%s\n",message)
Run Code Online (Sandbox Code Playgroud)
VS
gets(message)
Run Code Online (Sandbox Code Playgroud)
有什么区别?似乎他们都得到了消息的输入.
我理解"隐式声明"通常意味着在调用函数之前必须将函数置于程序的顶部,或者我需要声明原型.
但是,gets应该在stdio.h文件中(我已经包含在内).
有没有什么办法解决这一问题?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ch, file_name[25];
FILE *fp;
printf("Enter the name of file you wish to see\n");
gets(file_name);
fp = fopen(file_name,"r"); // read mode
if( fp == NULL )
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
}
Run Code Online (Sandbox Code Playgroud)