There are some Common Bugs in C Programming.

Most of the contents are directly from or modified from Prof. Liu Pangfeng’s blog. Most credits should go to him.

For all the following problems, answer the output message of the code, unless they are specified differently. If there are any exception(s) (or segmentation faults), indicate where it is (or they are). Most importantly, you need to explain the reason.

I don't want to write down the complete answer.

If you have some questions, please leave a message below. Thank you!

Problem 1:

//case 1
#include <string.h>
int main(void)
{
char *start = "this is a string";
char *start2 = strtok(start, " ");
return 0;
}
//case 2
#include <string.h>
int main(void)
{
char start[] = "this is a string";
char *start2 = strtok(start, " ");
start2 = "this is a string";
start2[4] = '\0';
return 0;
}

What happens and why?

Hint 1:

Maybe you can get an answer from herehere and here.

"this is a string" in char *start = "this is a string"
is stored in the code segment。
It can not be modified, so the program will cause a runtime error.
For case 1, modified ``char *start``to ``char start[]``

Problem 2:

#include <stdio.h>
int division(int *a, int *b)
{
return *a/*b /* a simple division */;
}
int main()
{
int a = 6;
int b = 2;
int *aptr = &a;
int *bptr = &b;
printf("%d\n", division(aptr, bptr));
}

What's wrong? How to fix it?

Problem 3:

#include <stdio.h>
#include <string.h>
int main(void)
{
char string[] = "this is a string";
char *start;
start = string;
start = strtok(start, " ");
while (start != NULL) {
printf("%s\n", start);
start = strtok(NULL, " ");
}
start = string;
start = strtok(start, " ");
while (start != NULL) {
printf("%s\n", start);
start = strtok(NULL, " ");
}
return 0;
}

Show output and explain the difference of the two loops.

Hint 3:

See the definition of function strtok()

Problem 4:

#include <stdio.h>
int main(void)
{
FILE *fp;
char c;
int count;
int i;
fp = fopen("file", "wb");
for (i = 0; i < 256; i++)
fputc(i, fp);
fclose(fp);
fp = fopen("file", "rb");
count = 0;
while ((c = fgetc(fp)) != EOF)
count++;
printf("count = %d\n", count);
return 0;
}

Explain why one is missing.

Hint 4:

Check the ASCII number of the EOF

Problem 5:

#include <stdio.h>
int main()
{
float a = 1.134;
float b = 3.402;
if (a * 3 == b)
printf("yes");
else
printf("no");
}

What happens and why?

Problem 6:

#include <stdio.h>
int main()
{
long int lab_tel = 035731603;
printf("my lab’s telephone number is %ld\n", lab_tel);
return 0;
}

Why is our lab number incorrect?

Hint 6:

Octal & Decimal

Problem 7:

#include <stdio.h>
int main()
{
int a[10];
if (a == &a)
printf("yes\n");
else
printf("no\n"); if (a + 1 == &a + 1)
printf("yes\n");
else
printf("no\n");
}

What happens and why?

Hint 7:

You may find the answer in here or here.

Problem 8:

#include <stdio.h>
int main(void)
{
FILE *fp;
fp = fopen("file", "w");
fputs("hello\n", fp);
fputs("hello", fp);
fputs("hello\n", fp);
fclose(fp);
return 0;
}

Answer the lengths of “file” in Unix and Windows, and explain.

Hint 8:

Windows: \CR\LF

Unix: \LF

Problem 9:

#include <stdio.h>
int main(void)
{
FILE *fp;
char c;
fp = fopen("file", "wb");
for (c = 0; c < 256; c++) {
fputc(c, fp);
}
fclose(fp);
return 0;
}

NEVER NEVER run this. Otherwise, your hard disk will crash.

Just tell what is wrong with this program.

Problem 10:

#include <stdio.h>
#define inc(x) ((x)++)
#define square(x) (x * x)
int main()
{
int i = 3;
int j = 4;
printf("%d\n", square(i + j));
printf("%d %d\n", square(inc(i)), i);
}

Explain the result, and how to fix it.

Problem 11:

struct csie {
char c;
short s;
int i;
double e;
};
struct ceis {
char c;
double e;
int i;
short s;
};
int main(void)
{
printf("csie = %d\n", sizeof(struct csie));
printf("ceis = %d\n", sizeof(struct ceis));
return 0;
}

Explain the result.

Hint: this is very very important to the program development in our lab.

Problem 12:

#include <stdio.h>
#include <string.h>
int main(void)
{
char source[] = "This is a string.";
char destination[4];
int i = 5;
strcpy(destination, source);
printf("i is %d\n", i);
printf("source is [%s]\n", source);
printf("destination is [%s]\n", destination);
return 0;
}

What happens and why? How to fix it?

Problem 13: (The examples are given by Ting-Fu Liao.)

/// header.h
#include <stdio.h>
static int val = 0;
void set(int x) ;
/// impl.c
#include "header.h"
void set(int x)
{
val = x ;
}
/// main.c
#include "header.h"
int main() {
set(100);
if ( val == 100 )
printf("val == 100\n");
else
printf("val != 100\n");
return 0;
}

Separate them into three files. What happens and how to fix it?

Problem 14:

#include <stdio.h>
int main()
{
char filename[80];
FILE *fp;
printf("input file name: ");
fgets(filename, 79, stdin);
fp = fopen(filename, "r");
// try assert(fp != NULL);
fclose(fp);
}

Why can’t you open the file? How to fix it.

Hint 14:

See the definition of fgets()

Problem 15:

int main()
{
int i = 2147483647;
unsigned int ui = 2147483647;
if (i + 1 < 0)
printf("i + 1 < 0\n");
if (ui + 1 > 0)
printf("ui + 1 > 0\n");
if (ui + 1 > i + 1)
printf("ui + 1 > i + 1\n");
return 0;
}

why?

Problem 16:

int main()
{
unsigned int ui = 2147483647;
if (ui + 1 > 0)
printf("ui + 1 > 0\n");
if (ui + 1 < -1)
printf("ui + 1 < -1\n");
return 0;
}

why?

Problem 17:

#include <stdio.h>
int main()
{
int i = -13;
if ((i / 2) == (i >> 1))
printf("yes\n");
else
printf("no\n");
return 0;
}

why?

Problem 18:

// for qsort, read http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/
/* qsort example */
#include <stdio.h>
#include <stdlib.h>
int values[] = {-2147483640, 50, 100};
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
} int main ()
{
int n;
qsort (values, 3, sizeof(int), compare);
for (n = 0; n < 3 ; n++)
printf ("%d ",values[n]);
return 0;
}

What happens and why? How to fix it?

Hint 18:

Integer overflow.

Problem 19:

#include <stdio.h>
#include <assert.h>
int main(void)
{
FILE *fp;
int c;
fp = fopen(__FILE__, "r");
assert(fp != NULL);
while ((c = fgetc(fp)) != EOF)
putchar(c);
fclose(fp);
return 0;
}

What is the output?

use "gcc –E test.c" to see what happens.

Problem 20:

#include <stdio.h>
#define SWAP(x, y) x ^= y ^= x ^= y main()
{
int i = 3;
int j = 5;
printf("%d\n", i);
printf("%d\n", j);
SWAP(i, j);
printf("%d\n", i);
printf("%d\n", j);
SWAP(i, i);
printf("%d\n", i);
}

What happens and why? Is strange skills good?

Hint 20:

Don't zuosi !

Problem 21:

#include <stdio.h>
main()
{
int i = 3;
i = i++ + ++i;
printf("%d\n", i);
}

Try this in both Visual C++ 6.0 and gcc.

Problem 22:

#include <stdio.h>
int main()
{
int type = 10;
int i =10;
switch (type) {
case 1:
i = 0;
printf("i = %d\n", i);
break;
case 2:
i = 4;
printf("i = %d\n", i);
break;
defualt:
i = 5;
printf("i = %d\n", i);
break;
}
return 0;
}

What happens ? why??? amazing?? easy.

Problem 23:

#include <stdio.h>
int *bar(int t)
{
int i = t;
int *temp = &i;
printf("temp is %d, (*temp) is %d\n", temp, *temp);
return temp;
} void foo(int a, int b)
{
int i;
int *temp = &i;
*temp = a+b;
} int main()
{
int *a;
a = bar(10);
printf("a is %d, (*a) is %d \n", a, *a);
foo(10, 20);
printf("a is %d, (*a) is %d \n", a, *a);
}

What happens and how to fix it?

Problem 24:

#include <stdio.h>
int main()
{
char i = 1;
char j;
scanf("%d", &j);
if (i & j)
printf("yes.\n");
else
printf("no.\n");
return 0;
}

Input

3

What happens and how to fix it?

Problem 25:

The sub1 below may result in a run-time error. Why?

int& sub1 ( int& a , int& b ){
int c = a − b ;
return c ;
}

The sub2 below does not result in a run-time error, but there may be some other

problem. What is the problem?

int& sub2 ( int& a , int& b ){
int ∗ pc = new int ;
∗pc = a − b ;
return (∗ pc ) ;
}

Hint 25:

stack & heap

Problem 26:

#include <iostream>
#include <cstdio>
#include <map>
#include <string>
using namespace std;
typedef void(*fn)();
map<string, fn> m;
#define FuncDef(cmd) void cmd_##cmd() { printf("cmd: "#cmd"\n"); }
#define RegFunc(cmd) m[#cmd] = cmd_##cmd;
FuncDef(quit);
FuncDef(help);
int main()
{
RegFunc(quit);
RegFunc(help);
string cmd;
while ( getline(cin,cmd) ){
if ( m.count(cmd) ) (*m[cmd])();
else printf("Not support %s\n", cmd.c_str());
}
return 0;
}

Show the output of the translated program, and run it. Also importantly, you need to give a scenario when/where you would use it in this way. Another small case is as below. (The examples are given by Ting-Fu Liao.)

#define test(x) x _x=a; pr##x##f(#x" %d",_x);
#include <stdio.h>
int main(a)
{
test(int);
return 0;
}

Common Bugs in C Programming的更多相关文章

  1. 【转】Multithreaded Python Tutorial with the “Threadworms” Demo

    The code for this tutorial can be downloaded here: threadworms.py or from GitHub. This code works wi ...

  2. 06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)

    Frequently Asked Questions (FAQ) Origins 起源 What is the purpose of the project? What is the history ...

  3. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  4. hadoop2.2编程:MRUnit测试

    引用地址:http://www.cnblogs.com/lucius/p/3442381.html examples: Overview This document explains how to w ...

  5. Thinking in Java——笔记(10)

    Inner Classes It allows you to group classes that logically belong together and to control the visib ...

  6. Linux 相关基础笔记

    html,body { } .CodeMirror { height: auto } .CodeMirror-scroll { } .CodeMirror-lines { padding: 4px 0 ...

  7. 【JavaScript】Registering JavaScript object methods as callbacks

    The registration of callback functions is very common in JavaScript web programming, for example to ...

  8. Event-based Asynchronous Pattern Overview基于事件的异步模式概览

    https://msdn.microsoft.com/zh-cn/library/wewwczdw(v=vs.110).aspx Applications that perform many task ...

  9. Java Concurrency - invokeAny & invokeAll

    Running multiple tasks and processing the first result A common problem in concurrent programming is ...

随机推荐

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(44)-工作流设计-设计表单

    系列目录 设计表单是比较复杂的一步,完成一个表单的设计其实很漫长,主要分为四步. 开始之前先说说表的结构. 其实表Flow_Form与Flow_FormContent设计是有一个缺陷的.我总共是设置最 ...

  2. 当master down掉后,pt-heartbeat不断重试会导致内存缓慢增长

    最近同事反映,在使用pt-heartbeat监控主从复制延迟的过程中,如果master down掉了,则pt-heartbeat则会连接失败,但会不断重试. 重试本无可厚非,毕竟从使用者的角度来说,希 ...

  3. ASP.NET Web API 配置 JSONP

    之前的一篇博文:jsonp跨域+ashx(示例) 1. 安装 Jsonp 程序集: PM> Install-Package WebApiContrib.Formatting.Jsonp PM&g ...

  4. C#/VB.NET Excel数据分列

    C#/VB.NET Excel数据分列 有时候我们需要将保存在Excel单元格中的组合型数据拆分为多列(如将全名拆分为姓和名两列)以方便我们处理.记忆或保存.为了避免重复和大量的手动输入工作,Exce ...

  5. 使用UICollectionView实现首页的滚动效果

    实现类似这样的效果,可以滚动大概有两种实现方案 1. 使用scrollview来实现 2. 使用UICollectionView来实现 第一种比较简单,而且相对于性能来说不太好,于是我们使用第二种方案 ...

  6. 制作自己的MVC框架(二)——启动

    自己写了个框架,取名为“PrimusPHP”,就3个文件夹,log中是日志文件,会自动生成. app中就是控制器和视图,public中是入口文件和静态资源,library中既有框架的核心类,还有工具类 ...

  7. 跨域之Ajax

    提到Ajax,一般都会想到XMLHttpRequest对象,通过这个对象向服务器发送请求,可以实现页面无刷新而更新数据. 由于同源策略的限制,一般情况下,只能通过XMLHttpRequest对象向同源 ...

  8. 结合ABP源码实现邮件发送功能

    1. 前言 2. 实现过程 1. 代码图(重) 2.具体实现 2.1 定义AppSettingNames及AppSettingProvider 2.2 EmailSenderConfiguration ...

  9. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  10. Autofac 的属性注入,IOC的坑

    Autofac 是一款优秀的IOC的开源工具,完美的适配.Net特性,但是有时候我们想通过属性注入的方式来获取我们注入的对象,对不起,有时候你还真是获取不到,这因为什么呢? 1.你对Autofac 不 ...