c语言教程有趣,直击C语言——7个有趣的问答

1.gets() 方法

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

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

#include

int main(void)

{

char buff[10];

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

gets(buff);

printf(" The buffer entered is [%s] ",buff);

return 0;

}

2,main() 方法的返回类型

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

#include

void main(void)

{

char *ptr = (char*)malloc(10);

if(NULL == ptr)

{

printf(" Malloc failed ");

return;

}

else

{

// Do some processing

free(ptr);

}

return;

}

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

3,内存泄露

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

#include

void main(void)

{

char *ptr = (char*)malloc(10);

if(NULL == ptr)

{

printf(" Malloc failed ");

return;

}

else

{

// Do some processing

}

return;

}

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

4,void* 与 C 结构体

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

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

int func(void *ptr)

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

5,* 与 ++ 操作符

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

#include

int main(void)

{

char *ptr = "Linux";

printf(" [%c] ",*ptr++);

printf(" [%c] ",*ptr);

return 0;

}

A:以上的输出将是:

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

6,局部变量的返回地址

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

#include

int* inc(int val)

{

int a = val;

a++;

return &a;

}

int main(void)

{

int a = 10;

int *val = inc(a);

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

return 0;

}

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

7,处理 printf() 参数

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

#include

int main(void)

{

int a = 10, b = 20, c = 30;

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

return 0;

}

A:输出将是

110..40..60

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

喜欢文章的可以给小编关注以及点赞

想学习c/c++的小伙伴可以加群:941636044,私聊群主领取C语言基础资料哦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 答案:C语言可以用循环和递归实现计算三个整数阶乘的和,示例代码如下: int factorial(int n){ int result = 1; for (int i = 1; i <= n; i++) { result = result * i; } return result; }int main(){ int num1, num2, num3; int sum = 0; scanf("%d %d %d", &num1, &num2, &num3); sum = factorial(num1) + factorial(num2) + factorial(num3); printf("%d\n", sum); return 0; } ### 回答2: 题目要求输入三个整数(范围在0——7之间),计算这三个整数的阶乘之和。 首先,阶乘即是将一个数连乘到1,如4的阶乘(记为4!)等于4 × 3 × 2 × 1。我们可以使用循环来计算阶乘,具体而言,使用for循环从1到该数递增并依次相乘,然后累加到一个变量中即可获得该数的阶乘。 下面是一个使用C语言编写的程序,实现了上述的功能: ```c #include <stdio.h> int main() { int num1, num2, num3; int factorial_sum = 0; printf("请输入三个整数(范围在0——7之间):\n"); scanf("%d %d %d", &num1, &num2, &num3); // 计算第一个数的阶乘并累加 int factorial1 = 1; for (int i = 1; i <= num1; i++) { factorial1 *= i; } factorial_sum += factorial1; // 计算第二个数的阶乘并累加 int factorial2 = 1; for (int i = 1; i <= num2; i++) { factorial2 *= i; } factorial_sum += factorial2; // 计算第三个数的阶乘并累加 int factorial3 = 1; for (int i = 1; i <= num3; i++) { factorial3 *= i; } factorial_sum += factorial3; printf("三个整数阶乘的和为:%d\n", factorial_sum); return 0; } ``` 通过该程序,用户可以输入三个整数,并在输出中得到这三个整数的阶乘之和。 需要注意的是,该程序假设用户输入的三个整数范围在0——7之间,并且未进行输入合法性检查,因此需要确保输入符合题目要求。为了简化程序,没有考虑负数、浮点数等情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值