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. 搭建自己的Nuget服务器

    序言 你们公司有没有好多项目,有没有好多类库,你们的类库是在tfs中管理,还是svn或者github,又或者是各自为政版本类库随意使用? 那么你们使用者写类库的时候方便吗? 有没有更新下载,版本不一致 ...

  2. dom addeventlistener与id 绑定事件的区别

    文档中有写. //addEventListener() 方法用于向指定元素添加事件句柄. //提示: 使用 removeEventListener() 方法来移除 addEventListener() ...

  3. AutoMapper对internal访问级别属性的映射

    最近在使用DDD重新搭建公司内部OA的架构,具体情况搭好了应该会写一下,这里说的是今天遇到的问题. 先简单说一下相关的几个部分: 1.聚合.聚合分成了两个模块:一个包含审批单据等估计至少今年不会怎么变 ...

  4. ASP.NET MVC5+EF6+EasyUI 后台管理系统(7)-MVC与EasyUI DataGrid

    系列目录 本节知识点 为了符合后面更新后的重构系统,文章于2016-11-1日重写 EasyUI读取MVC后台Json数据 开始实现 我们的系统似乎越来越有趣了 首先从前端入手,开打View下面的Sh ...

  5. AHCI: Failed to attach drive to Port1 (VERR_GENERAL_FAILURE).

    在mac操作系统下,安装VirtualBoxVm虚拟机,虚拟机里面安装wind7操作系统.在启动虚拟机的时候报错:AHCI: Failed to attach drive to Port1 (VERR ...

  6. RPC远程过程调用学习之路(一):用最原始代码还原PRC框架

    RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用. rpc的实现方式有很多,可以通 ...

  7. 读书笔记--SQL必知必会--常用MySQL(MariaDB)命令

    DBMS信息 显示DBMS的版本 select version(); 显示DBMS状态 status; 显示DBMS资源状态 show status; 显示DBMS支持的权限 show privile ...

  8. SpringMVC一路总结(一)

    SpringMVC听闻已久,早在去年就被学长问到关于SpringMVC的基础知识,当时也没在意.主要是工作中也没有用到关于SpringMVC的技术,因此免于没有时间和精力的借口就没有接触和学习Spri ...

  9. 扩展方法解决LinqToSql Contains超过2100行报错问题

    1.扩展方法 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  10. 如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites]

    如何在ASP.NET Web站点中统一页面布局[Creating a Consistent Layout in ASP.NET Web Pages(Razor) Sites] 一.布局页面介绍[Abo ...