有趣的C语言题

1 #include <stdio.h>
2 int main(void)
3 {
4     char buff[10];
5     memset(buff,0,sizeof(buff));
6     gets(buff);
7     printf("\n The buffer entered is [%s]\n",buff);
8     return 0;
9 }

这是一道有趣的C语言题,代码运行看似没错,却隐含着安全问题,问题在于gets()函数,这个函数是接收标准输入的一串字符串,并且没有检查字符串缓冲区的大小就直接拷贝到buff数组中,这可能导致在写入buff内存时溢出,可以使用fgets()函数代替此函数,格式类似如下:

char *fgets(char *str,int n,FILE *stream);
时间: 2024-10-25 14:58:41

有趣的C语言题的相关文章

12个有趣的C语言问答(详解)

本文参照博文<12个有趣的C语言问答>,在原文的基础上增加来对应的知识点的详细介绍. 1 gets()方法 Q:下面的代码有一个被隐藏的问题,你能找到它吗? 1 #include <stdio.h> 2 3 int main(void) 4 { 5 char buff[10]; 6 memset(buff, 0, sizeof(buff)); 7 gets(buff); 8 printf("%s\n", buff); 9 10 return 0; 11 } A:

经典c语言题

1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 2. 写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个. #define MIN(A,B) ((A) <= (B) ?(A) : (B)) 5. 用变量a给出下面的定义 a) 一个整型数(An integer) b) 一个指向整型数的指针(A pointer to an integer)

关于定义顺序和内存分配的关系--记一道不严谨的C语言题

include<stdio.h> #include<iostream> int main() { char a[] = "123"; char b[] = "abcd"; if (a > b) { printf("a>b \n"); } else printf("a<b\n"); printf("%p\n %p\n", a, b); system("pau

有趣的C语言小程序

判断下面程序输出的内容: #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> int main()  {      int i=43;        printf("%d\n",printf("%d",printf("%d",i)));       system("pause");       return 0

12个有趣的C语言面试题及答案

12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出下面代码里的问题: #include<stdio.h> int main(void) { char buff[10]; memset(buff,0,sizeof(buff)); gets(buff); printf("\n The buffer entered is [%s]\n",buff); return 0; } 答:上面代码里的问题在于函数gets()的

一个有趣的C语言问题:s = (++i) + (++i) + (++i)

今天看到有人提了这么个问题: i=3,s=0 s=(++i)+(++i)+(++i ) 为什么结果是s=16,i=6呢 初一看,我想结果不应该是15(4+5+6)吗,是他搞错了吧,保险起见,我决定用编译器运行一下,看一下结果,先是用VC是了一下,结果确实没错, 会不会是编译器问题,不行,我再试试其他编译器,换了codeblocks试了一下: 那么DevC++呢,我再试了一下: 结果还是这样,好吧,我放弃了,结果就应该是16,那么这又是为什么呢? 我定下心来,仔细想了想,想了片刻,觉得应该是这样:

c语言题中的一些陷阱

1.求下列两个数组的长度关系 characX[] = "abcdefg"; char acY[] ={ 'a', 'b','c', 'd', 'e', 'f', 'g' }; 解析:对于字符串来说,字符串结尾默认为'\0',所以acX[]的长度为8,而第二个数组的大小长度为7,而且因为没有用'\0'结尾,所以在屏幕上输出的值是不确定的. 2.求下列程序的输出结果 void example(characHello[]) { printf("%d\n", sizeof(

昨天面试遇到的一道C语言题

楼主之前是做C/C++开发的,今年转到java,hadoop方向了,所以很多C/C++的细节都有些模糊了,碰巧这次面试题中,就出了一道C指针的问题. 问题不算难,但楼主一时之间竟也想不起来答案了... 这道题给出了一小段程序,要你写出结果,程序如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 void func(char *p) 6 { 7 p = (char *) mall

C语言题

1.有n个整数的数组,使其前面各数顺序向后移m个位置,最后m个数移到最前面 1 /*################################################################################################################## 2 # 3 # 有n个整数的数组,使其前面各数顺序向后移m个位置,最后m个数移到最前面 4 # 5 ###########################################