相关疑难解决方法(0)

508
推荐指数
8
解决办法
5万
查看次数

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

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

我明白了

警告:

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

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

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

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

c gets fgets buffer-overflow

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

从fgets()输入中删除尾随换行符

我试图从用户那里获取一些数据并将其发送到gcc中的另一个函数.代码是这样的.

printf("Enter your Name: ");
if (!(fgets(Name, sizeof Name, stdin) != NULL)) {
    fprintf(stderr, "Error reading Name.\n");
    exit(1);
}
Run Code Online (Sandbox Code Playgroud)

但是,我发现它最后有一个换行符\n.所以,如果我输入John它最终发送John\n.如何删除它\n并发送正确的字符串.

c string gcc newline fgets

210
推荐指数
5
解决办法
30万
查看次数

scanf()将新行char留在缓冲区中

我有以下程序:

int main(int argc, char *argv[])
{
  int a, b;
  char c1, c2;
  printf("Enter something: ");
  scanf("%d",&a); // line 1
  printf("Enter other something: ");
  scanf("%d", &b); // line 2

  printf("Enter a char: ");
  scanf("%c",&c1); // line 3
  printf("Enter another char: ");
  scanf("%c", &c2); // line 4

  printf("Done"); // line 5

  system("PAUSE");

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如我在C书中读到的那样,作者说scanf()在缓冲区中留下了一个新的行字符,因此,程序不会在第4行停止供用户输入数据,而是将新行字符存储在c2中并移至第5行.

是对的吗?

但是,这只发生在char数据类型中吗?因为我没有int在第1,2,3行中看到数据类型的这个问题.是不是?

c scanf

71
推荐指数
5
解决办法
6万
查看次数

如何清除C中的输入缓冲区?

我有以下程序:

int main(int argc, char *argv[])
{
  char ch1, ch2;
  printf("Input the first character:"); // Line 1
  scanf("%c", &ch1); 
  printf("Input the second character:"); // Line 2
  ch2 = getchar();

  printf("ch1=%c, ASCII code = %d\n", ch1, ch1);
  printf("ch2=%c, ASCII code = %d\n", ch2, ch2);

  system("PAUSE");  
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如上面代码的作者所解释的那样:程序将无法正常工作,因为在第1行,当用户按下Enter时,它将在输入缓冲区中留下2个字符:Enter key (ASCII code 13)\n (ASCII code 10).因此,在第2行,它将读取\n并且不会等待用户输入字符.

好的,我明白了.但我的第一个问题是:为什么第二个getchar()(ch2 = getchar();)不读取Enter key (13)而不是\n字符?

接下来,作者提出了两种解决此类问题的方法:

  1. 使用 fflush()

  2. 写一个这样的函数:

    void
    clear …
    Run Code Online (Sandbox Code Playgroud)

c buffer

70
推荐指数
7
解决办法
32万
查看次数

使用fflush(stdin)

因此,谷歌快速搜索fflush(stdin)清除输入缓冲区会发现许多网站警告不要使用它.然而,这正是我的CS教授教授课程的原因.

使用有多糟糕fflush(stdin)?即使我的教授正在使用它并且似乎完美无缺地工作,我是否真的应该放弃使用它?

c stdin fflush

69
推荐指数
6
解决办法
4万
查看次数

如何读取未知长度的输入字符串?

如果我不知道这个词有多长,我就不会写char m[6];,
这个词的长度可能是十到二十个.如何使用scanf键盘输入?

#include <stdio.h>
int main(void)
{
    char  m[6];
    printf("please input a string with length=5\n");
    scanf("%s",&m);
    printf("this is the string: %s\n", m);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请输入一个lenght = 5 的字符串
你好
这是字符串:hello

c scanf

57
推荐指数
5
解决办法
13万
查看次数

如何正确安全地使用sscanf

首先,关于使用的其他问题sscanf不回答我的问题,因为常见的答案是根本不sscanf使用fgets或使用或getch替代,这在我的情况下是不可能的.

问题是我的C教授要我scanf在一个程序中使用.这是一个要求.但是程序也必须处理所有不正确的输入.

程序必须读取整数数组.以什么格式提供数组的整数并不重要.为了使任务更容易,程序可能首先读取数组的大小,然后读取每行中的整数.

程序必须处理这些输入(并适当地报告错误):

  1. 999999999999999 ... 9(数字大于整数)
  2. 12a3(不要将其读作整数12)
  3. a ... z(字符串)
  4. 11 aa 22 33 \n所有在一行(这可能通过丢弃11之后的所有内容来处理)
  5. 输入大于输入数组

可能有更多不正确的案例,这是我能想到的唯一案例.

如果提供了错误输入,程序必须要求用户再次输入,直到给出正确的输入,但必须保留先前正确的输入(只有输入流中必须清除不正确的输入).

一切都必须符合C99标准.

c scanf

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

CLion 建议使用 'strtol' 而不是 'scanf'

#include <stdio.h>

int main(int argc, char** argv) {
    int num = 0;

    printf("Input: ");
    scanf("%d", &num); <<<

    printf("%d\n", num);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

scanf("%d", #);

Clang-Tidy: 'scanf' 用于将字符串转换为整数值,但函数不会报告转换错误;考虑使用“strtol”代替


我用 CLion 编写了一个非常简单的代码,它推荐我使用“strtol”而不是“scanf”。

但我只使用整数变量,没有字符串。我不明白为什么弹出检查消息。

如何修改此代码?

c clion

8
推荐指数
1
解决办法
7083
查看次数

为什么应该使用 strtok(line, "\n") **not** 去除 fgets() 留下的换行符

fgets()是一个读取一行输入的安全函数,但它会将从文件中读取的新行字节存储'\n'在数组中(如果合适的话)。

在许多情况下(如果不是大多数情况),必须在进一步处理行内容之前删除此新行

可以使用几种简单的方法,但我看到了一个紧凑而棘手的建议:

strtok(line, "\n");    // strip the newline
Run Code Online (Sandbox Code Playgroud)

为什么这种方法不正确,为什么它并不总是有效?

c newline fgets strtok

3
推荐指数
1
解决办法
68
查看次数