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. .NET MVC4 Razor视图预编译(一)

    在平时使用.NET MVC中不乏有类似的需求:某些razor视图,特别是系统后台的视图,不想让用户自行更改,需要通过某种方法把视图模板编译到项目的dll中去. 但是VS并不提供razor的预编译,如果 ...

  2. 设置MYSQL允许用IP访问

    mysql>use mysql; mysql>update user set host = '%'  where user ='root'; mysql>flush privileg ...

  3. 【Oracle 集群】11G RAC 知识图文详细教程之RAC在LINUX上使用NFS安装前准备(六)

    RAC在LINUX上使用NFS安装前准备(六) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇 ...

  4. Vertica 分区表设计

    Vertica数据库中的表只是一个逻辑概念. 实际存储在磁盘上的是projection. 当创建一张表,没有创建projection时,那么插入数据的时候会自动创建一个默认的projection.如果 ...

  5. 黄聪:如何给wordpress的编辑器添加一个自定义按钮,并且实现插入功能

    1.添加按钮 在  functions.php  文件里面添加下面代码: add_action('media_buttons', 'add_my_media_button'); function ad ...

  6. [Servlet] 初识Servlet

    什么是Servlet? 定义 Servlet的全称是 Server Applet,顾名思义,就是用 Java 编写的服务器端程序. Servlet 是一个 Java Web开发标准,狭义的Servle ...

  7. JS魔法堂:深究JS异步编程模型

    前言  上周5在公司作了关于JS异步编程模型的技术分享,可能是内容太干的缘故吧,最后从大家的表情看出"这条粉肠到底在说啥?"的结果:(下面是PPT的讲义,具体的PPT和示例代码在h ...

  8. PyQt4入门学习笔记(四)

    在PyQt4中的事件和信号 事件 所有的GUI应用都是事件驱动的.事件主要是来自于应用的使用者,但是像互联网连接,窗口管理器或者计时器也可以产生事件.当我们调用应用的exec_()方法时,应用就进入了 ...

  9. mongodb在java中的查询

    mongodb 根据_id 查询记录: public Price queryPriceById(String id) throws Exception { return mongoTemplate.f ...

  10. Springl利用Aspectj的扩展实现Aop

    1. Spring为什么要使用Aspectj Spring Aop:Spring自己原生的Aop,只能用一个词来形容:难用. 你需要实现大量的接口,继承大量的类,所以spring aop一度被千夫所指 ...