12个关于C语言的有趣问答_C 语言

本文汇总了12个关于C语言的问答,对于加深对C语言程序设计的难点理解很有帮助,读者可参考一下:

1、gets() 方法

问:以下代码有个被隐藏住的问题,你能找到它吗?

答:这个不显眼的问题就是使用了 gets() 方法。此方法接受一个string类型参数,但是却没有检测此数值是否 有足够的空间来拷贝数据。所以这里我们一般用 fgets() 方法将来的更好。

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

2、strcpy() 方法

问:密码防护是很基本的功能,看看能否搞定下面这段代码?

#include<stdio.h>

int main(int argc, char *argv[])
{
  int flag = 0;
  char passwd[10];

  memset(passwd,0,sizeof(passwd));

  strcpy(passwd, argv[1]);

  if(0 == strcmp("LinuxGeek", passwd))
  {
    flag = 1;
  }

  if(flag)
  {
    printf("\n Password cracked \n");
  }
  else
  {
    printf("\n Incorrect passwd \n");

  }
  return 0;
}

3、main() 方法的返回类型

问:请问下面这段代码能否通过编译?如果能的话,那么这段代码中隐含什么问题吗?

#include<stdio.h>

void main(void)
{
  char *ptr = (char*)malloc(10);

  if(NULL == ptr)
  {
    printf("\n Malloc failed \n");
    return;
  }
  else
  {
    // Do some processing

    free(ptr);
  }

  return;
}

答:答案是代码能通过编译,但是会留下针对main()方法的返回类型的警告。main()方法的真正返回类型应该为'int'而非'void'。这是因为'int'返回类型能够让程序返回状态值。尤其是当这段程序作为其他应用的附属程序时这个状态值将更加重要。

4、内存泄露

问:请问以下代码有内存泄露吗?

#include<stdio.h>

void main(void)
{
  char *ptr = (char*)malloc(10);

  if(NULL == ptr)
  {
    printf("\n Malloc failed \n");
    return;
  }
  else
  {
    // Do some processing
  }

  return;
}

答:好,虽然上面的代码没有对指针 ptr 进行内存释放,但实际上即使是程序结束也不会造成内存泄露,因为当程序结束时所有一开始被占据的内存就全部清空了。但如果上面这段代码是在 while 循环里面那将会造成严重的问题

补充: 如果你需要了解更多关于内存泄露的问题,你可以参考这篇文章http://www.jb51.net/article/41216.htm

5、free() 方法

问:以下代码当用户输入'freeze'时会奔溃,而如果输入'zebra'则运行正常,这是为什么?

#include<stdio.h>

int main(int argc, char *argv[])
{
  char *ptr = (char*)malloc(10);

  if(NULL == ptr)
  {
    printf("\n Malloc failed \n");
    return -1;
  }
  else if(argc == 1)
  {
    printf("\n Usage \n");
  }
  else
  {
    memset(ptr, 0, 10);

    strncpy(ptr, argv[1], 9);

    while(*ptr != 'z')
    {
      if(*ptr == '')
        break;
      else
        ptr++;
    }

    if(*ptr == 'z')
    {
      printf("\n String contains 'z'\n");
      // Do some more processing
    }

    free(ptr);
  }

  return 0;
}

答:问题的根源是因为代码在while循环中改变了 ptr 指针的地址。当输入为'zebra'时,while循环甚至在执行 第一遍前就结束了,所以free()释放的内存地址就是一开始malloc()分配的地址。但是当输入'freeze'时, ptr记录的地址在while循环中被更改,因为将会是错误的地址传递到free()方法中引起崩溃。

6、atexit with _exit

问:在以下代码,atexit()方法并没有被调用,你知道为什么吗?

#include<stdio.h>

void func(void)
{
  printf("\n Cleanup function called \n");
  return;
}

int main(void)
{
  int i = 0;

  atexit(func);

  for(;i<0xffffff;i++);

  _exit(0);
}

答:这是因为使用了 _exit() 方法。此方法并没有调用清除数据相关的方法,比如 atexit()等。

7、void* 与 C 结构体

问:能否设计一个方法接受任意类型的参数然后返回整数?同时是否有办法传递多个这样的参数?

A:一个能接受任意类型参数的方法像下面这个样子:

int func(void *ptr)

如果需要传递多个参数,那么我们可以传递一个包含这些参数的结构体

8、* 与 ++ 操作符

问:以下代码将输出什么?为什么?

#include<stdio.h>

int main(void)
{
  char *ptr = "Linux";
  printf("\n [%c] \n",*ptr++);
  printf("\n [%c] \n",*ptr);

  return 0;
}

答:以上的输出将是:

因为++与 * 的优先级一样,所以 *ptr++ 将会从右向左操作。按照这个逻辑,ptr++ 会先执行然后执行*ptr。所以第一个结果是'L'。也因为 ++ 被执行了,所以下一个printf() 结果是'i'。

9、Making changes in Code segment

问:以下代码运行时一定会崩溃,你能说出原因吗?

#include<stdio.h>

int main(void)
{
  char *ptr = "Linux";
  *ptr = 'T';

  printf("\n [%s] \n", ptr);

  return 0;
}

答:这是因为,通过 *ptr = ‘T',此行代码尝试更改只读内存存储的字符串'Linux'。此操作当然行不通所以才会造成崩溃。

10、Process that changes its own name

问:你能否写一个程序在它运行时修改它的名称?

答:以下代码可以完成

#include<stdio.h>

int main(int argc, char *argv[])
{
  int i = 0;
  char buff[100];

  memset(buff,0,sizeof(buff));

  strncpy(buff, argv[0], sizeof(buff));
  memset(argv[0],0,strlen(buff));

  strncpy(argv[0], "NewName", 7);

  // Simulate a wait. Check the process
  // name at this point.
  for(;i<0xffffffff;i++);

  return 0;
}

11、局部变量的返回地址

问:下面的代码有问题吗?如果有,如何修改?

#include<stdio.h>

int* inc(int val)
{
 int a = val;
 a++;
 return &a;
}

int main(void)
{
  int a = 10;

  int *val = inc(a);

  printf("\n Incremented value is equal to [%d] \n", *val);

  return 0;
}

答:虽然上面的代码有时运行会很好,但是在方法 inc() 中有很严重的隐患。当inc()方法执行后,再次使用局部变量的地址就会造成不可估量的结果。解决之道就是传递变量a的地址给main()。

12、处理 printf() 参数

问:以下代码输出请问是什么?

#include<stdio.h>

int main(void)
{
  int a = 10, b = 20, c = 30;

  printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2));

  return 0;
}

答:输出将是

110..40..60

这是因为参数都是从右向左处理的,然后打印出来却是从左向右。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
问答
c语言输出有趣图案、有趣的c语言表白程序、c语言有趣小程序代码、c语言有趣的小程序、有趣的c语言程序,以便于您获取更多的相关知识。

时间: 2024-09-11 14:13:21

12个关于C语言的有趣问答_C 语言的相关文章

浅谈C语言的字符串分割_C 语言

说起来很有意思,自认为对C语言理解得还是比较深刻的.但居然到今天才知道有个strtok函数,试用了一下突然感慨以前做了多少重复劳动.每次需要解析配置文件,每次需要分割字符串,居然都是自己去分割字符串,既累人又容易出错.感概技术学得不够全面啊!这里引用一段strtok用法: The strtok() function returns a pointer to the next "token" in str1, where str2 contains the delimiters that

原创的C语言控制台小游戏_C 语言

最开始左上色块被感染,通过切换颜色,不断感染同色色块.亮点是可以切换图案,设置方块个数和最大限制次数.整体还是比较满意,希望大神指教. #include <stdio.h> #include <windows.h> #include <conio.h> #include <time.h> #include <stdlib.h> int DIFFICULT=44; int count=0 ; int TYPE_SHAPE=2 ; int flag=

C语言实现冒泡排序算法_C 语言

BubblSort.c #include<stdio.h> void BubbleSort(int a[],int len) { int i; int j; int h; int temp; for(i=0;i<len-1;++i) { for(j=len-1;j>i;--j) { if(a[j]<a[j-1]) { temp=a[j]; a[j]=a[j-1]; a[j-1]=temp; } } for(h=0;h<len;h++) { printf(" %

如何用C语言画一个“圣诞树”_C 语言

如何用C语言画一个"圣诞树",我使用了左右镜像的Sierpinski triangle,每层减去上方一小块,再用符号点缀.可生成不同层数的「圣诞树」,如下图是5层的结果 #include <stdlib.h> int main(int argc, char* argv[]) { int n = argc > 1 ? atoi(argv[1]) : 4; for (int j = 1; j <= n; j++) { int s = 1 << j, k

C语言泛型编程实例教程_C 语言

本文实例讲述了C语言泛型编程的方法,分享给大家供大家参考之用.具体分析如下: 首先,泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同.在C语言中,可以通过一些手段实现这样的泛型编程.这里介绍一种方法--通过无类型指针void* 看下面的一个实现交换两个元素内容的函数swap,以整型int为例: void swap(int* i1,int* i2){ int temp; temp = *i1; *i1 = *i2; *i2 = temp; } 当你想交换两个

C语言冒泡排序法心得_C 语言

记得以前在大学里学习c语言的时候,刚开始是很吃力的. 入门级别的算法中有个叫冒泡排序法,也有称为气泡排序法.那时候刚接触它就对它的名字特别感兴趣,因为觉得很有意思.好了,废话不多说了,我们先一起简单回忆下这个冒泡排序法.  一.打印行和列一般是这样的一个简单代码,输出4行4列*: for(int i = 1,i < 5,i++){ for(int j = 1,j < 5,j++){ printf("*"); } printf("n\"); }  二.打印

C语言字符串大小比较_C 语言

C语言字符串大小比较 #include <stdio.h> #include <string.h> int fun(char *a,char *b) { int i = 0,j = 0; while(a[i]&&b[j]) { if(a[i]-b[j]>0) return 1; else if(a[i]-b[j]<0) return -1; i++,j++; } if(strlen(a)==i&&strlen(b)==j) return

C语言 数据类型详细介绍_C 语言

C 数据类型 在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统.变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式. C 中的类型可分为以下几种: 序号 类型与描述 1 基本类型: 它们是算术类型,包括两种类型:整数类型和浮点类型. 2 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量. 3 void 类型: 类型说明符 void 表明没有可用的值. 4 派生类型: 它们包括:指针类型.数组类型.结构类型.共用体类型和函数类型.

6个变态的C语言Hello World程序_C 语言

下面的六个程序片段主要完成这些事情: 输出Hello, World 混乱C语言的源代码 下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C++的编译器g++才能编程通过. hello1.c #define _________ } #define ________ putchar #define _______ main #define _(a) ________(a); #define ______ _______(){ #define __ ______ _(0x48)_(0x65