标签: gets

为什么获取功能如此危险以至于不应该使用它?

当我尝试编译使用gets()GCC函数的C代码时,

我明白了

警告:

(.text + 0x34):警告:`gets'函数很危险,不应该使用.

我记得这与堆栈保护和安全性有关,但我不确定为什么?

有人可以帮我删除这个警告并解释为什么会有这样的使用警告gets()

如果gets()是如此危险,为什么我们不能删除它?

c gets fgets buffer-overflow

210
推荐指数
9
解决办法
14万
查看次数

站点编码字节上的“ gets(stdin)”怎么回事?

Coderbyte是一个在线编码挑战网站(我在2分钟前找到了它)。

遇到的第一个C ++挑战有一个您需要修改的C ++框架:

#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;

}
Run Code Online (Sandbox Code Playgroud)

如果你稍微熟悉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但这与我在这里的问题无关。

c++ gets input standards-compliance

144
推荐指数
3
解决办法
7159
查看次数

C - scanf()vs gets()vs fgets()

我一直在做一个相当简单的程序,将一串字符(假设输入数字)转换为整数.

我改完之后,我注意到一些非常奇特的"错误",我不能回答大多是因我有限的知识如何,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)

c gets scanf fgets

36
推荐指数
4
解决办法
9万
查看次数

得到的安全替代方案

我想从标准输入中读取整行,包括两个单词之间的空格.

当使用get on gcc时,我收到以下消息:

send.c:(.text+0x2a): warning: the `gets' function is dangerous and should not be used.
Run Code Online (Sandbox Code Playgroud)

什么是更好的选择?

c c++ gets fgets

25
推荐指数
0
解决办法
2万
查看次数

当参数传递给我的ruby脚本时,为什么会抛出错误?

我正在使用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()没有帮助).

ruby gets

14
推荐指数
1
解决办法
3120
查看次数

为什么我可以在gcc -std = c11中使用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)

c gcc gets language-lawyer c11

12
推荐指数
1
解决办法
1189
查看次数

Ruby'获取'可以在多行上运行

使用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)

ruby gets

11
推荐指数
3
解决办法
5888
查看次数

在获取之前输入C. Scanf.问题

我是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)

它会工作.虽然,我不能改变秩序,我需要它原样.有人能帮我吗 ?也许我需要使用其他一些功能.谢谢!

c gets input scanf

10
推荐指数
2
解决办法
2万
查看次数

gets和scanf有什么区别?

如果代码是

scanf("%s\n",message)  
Run Code Online (Sandbox Code Playgroud)

VS

gets(message)
Run Code Online (Sandbox Code Playgroud)

有什么区别?似乎他们都得到了消息的输入.

c gets scanf

10
推荐指数
3
解决办法
6万
查看次数

"获取"的隐含声明

我理解"隐式声明"通常意味着在调用函数之前必须将函数置于程序的顶部,或者我需要声明原型.
但是,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)

c linux gets

9
推荐指数
2
解决办法
3万
查看次数

标签 统计

gets ×10

c ×7

fgets ×3

scanf ×3

c++ ×2

input ×2

ruby ×2

buffer-overflow ×1

c11 ×1

gcc ×1

language-lawyer ×1

linux ×1

standards-compliance ×1