C和C++中未定义,未指定和实现定义的行为有什么区别?
c c++ undefined-behavior unspecified-behavior implementation-defined-behavior
当我尝试编译使用gets()GCC函数的C代码时,
我明白了
警告:
(.text + 0x34):警告:`gets'函数很危险,不应该使用.
我记得这与堆栈保护和安全性有关,但我不确定为什么?
有人可以帮我删除这个警告并解释为什么会有这样的使用警告gets()?
如果gets()是如此危险,为什么我们不能删除它?
我试图从用户那里获取一些数据并将其发送到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并发送正确的字符串.
我有以下程序:
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行中看到数据类型的这个问题.是不是?
我有以下程序:
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字符?
接下来,作者提出了两种解决此类问题的方法:
使用 fflush()
写一个这样的函数:
void
clear …Run Code Online (Sandbox Code Playgroud)因此,谷歌快速搜索fflush(stdin)清除输入缓冲区会发现许多网站警告不要使用它.然而,这正是我的CS教授教授课程的原因.
使用有多糟糕fflush(stdin)?即使我的教授正在使用它并且似乎完美无缺地工作,我是否真的应该放弃使用它?
如果我不知道这个词有多长,我就不会写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
首先,关于使用的其他问题sscanf不回答我的问题,因为常见的答案是根本不sscanf使用fgets或使用或getch替代,这在我的情况下是不可能的.
问题是我的C教授要我scanf在一个程序中使用.这是一个要求.但是程序也必须处理所有不正确的输入.
程序必须读取整数数组.以什么格式提供数组的整数并不重要.为了使任务更容易,程序可能首先读取数组的大小,然后读取每行中的整数.
程序必须处理这些输入(并适当地报告错误):
可能有更多不正确的案例,这是我能想到的唯一案例.
如果提供了错误输入,程序必须要求用户再次输入,直到给出正确的输入,但必须保留先前正确的输入(只有输入流中必须清除不正确的输入).
一切都必须符合C99标准.
#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”。
但我只使用整数变量,没有字符串。我不明白为什么弹出检查消息。
如何修改此代码?
fgets()是一个读取一行输入的安全函数,但它会将从文件中读取的新行字节存储'\n'在数组中(如果合适的话)。
在许多情况下(如果不是大多数情况),必须在进一步处理行内容之前删除此新行。
可以使用几种简单的方法,但我看到了一个紧凑而棘手的建议:
strtok(line, "\n"); // strip the newline
Run Code Online (Sandbox Code Playgroud)
为什么这种方法不正确,为什么它并不总是有效?