当我尝试编译使用gets()GCC函数的C代码时,
我明白了
警告:
(.text + 0x34):警告:`gets'函数很危险,不应该使用.
我记得这与堆栈保护和安全性有关,但我不确定为什么?
有人可以帮我删除这个警告并解释为什么会有这样的使用警告gets()?
如果gets()是如此危险,为什么我们不能删除它?
在这里,我在接受的答案中看到了这个陈述:
大多数转换说明符都跳过前导空格,包括换行符但
%c不跳过.
对我来说,不清楚这种不同行为的基本原理,我会期待一个统一的(例如总是跳过或从不).
我用这样的一段C代码遇到了这种问题:
#include "stdio.h"
int main(void){
char ch;
int actualNum;
printf("Insert a number: ");
scanf("%d", &actualNum);
// getchar();
printf("Insert a character: ");
scanf("%c", &ch);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
交换两个scanf小号解决了问题,以及在(注释)getchar,否则'\n'该第一插入将由所述第二消耗scanf与%c.我在linux和windows上测试了gcc,行为是一样的:
gcc(GCC)4.7.2 20120921(Red Hat 4.7.2-2)
版权所有(C)2012 Free Software Foundation,Inc.
这是免费软件; 查看复制条件的来源.没有保修; 甚至不适用于适销性或特定用途的适用性.
所以我的问题是:为什么%d和%c行为不同WRT '\n'的scanf?
我很难编写理解说明符和字符串函数的格式.
我的目的是用来%[]读取所有字符和空格,然后使用strcpy函数,然后使用strcat函数.
到目前为止,我已经设法输入单个字符并打印出来,不包括空格.
这是迄今为止的代码;
int main(int argc, char** argv) {
char words[30];
int loops;
printf("How many letters would you like to enter? - ");
scanf("%d",&loops);
for(int i=0;i<loops;i++){
printf("Provide some text as input:");
scanf("%s", &words[i]);
}
printf("%d", strlen(words));
printf("%s",&words);
return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
int main(){
int l,m,q,j;
char option;
scanf("%d",&q);
printf("%d\n",q);
for(j=0;j<q;j++){
scanf("%c %d %d",&option,&l,&m);
printf("%c %d %d",option,l,m);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
3(Input)
3
C 1 4(Input)
0 -374066224C 1 4
Run Code Online (Sandbox Code Playgroud)
上面的代码有什么问题?它没有给出预期的输出.