Common Bugs in C Programming
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 here, here 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?
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的更多相关文章
- 【转】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 ...
- 06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)
Frequently Asked Questions (FAQ) Origins 起源 What is the purpose of the project? What is the history ...
- 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...
- hadoop2.2编程:MRUnit测试
引用地址:http://www.cnblogs.com/lucius/p/3442381.html examples: Overview This document explains how to w ...
- Thinking in Java——笔记(10)
Inner Classes It allows you to group classes that logically belong together and to control the visib ...
- Linux 相关基础笔记
html,body { } .CodeMirror { height: auto } .CodeMirror-scroll { } .CodeMirror-lines { padding: 4px 0 ...
- 【JavaScript】Registering JavaScript object methods as callbacks
The registration of callback functions is very common in JavaScript web programming, for example to ...
- Event-based Asynchronous Pattern Overview基于事件的异步模式概览
https://msdn.microsoft.com/zh-cn/library/wewwczdw(v=vs.110).aspx Applications that perform many task ...
- Java Concurrency - invokeAny & invokeAll
Running multiple tasks and processing the first result A common problem in concurrent programming is ...
随机推荐
- 高性能JavaScript--快速响应的用户界面(简要学习笔记三)
1.浏览器线程:用于执行JavaScript和更新用户界面的进程被称为“浏览器UI线程”. 2. <1>定时器的出现让出UI线程控制权 setTimeout(),setInterval ...
- ITTC数据挖掘平台介绍(四) 框架改进和新功能
本数据挖掘框架在这几个月的时间内,有了进一步的功能增强 一. 超大网络的画布显示虚拟化 如前几节所述,框架采用了三级层次实现,分别是数据,抽象Node和绘图的DataPoint,结构如下: ...
- CSS 基础篇、绝对有你想要
本章内容: 简介 CSS 定义 四种引入方式 样式应用的顺序 选择器(Selector) * 通用元素选择器 标签选择器 class 类选择器 # ID选择器 , 多元素选择器 后代元素选择器 > ...
- ASP.NET Core 介绍
原文:Introduction to ASP.NET Core 作者:Daniel Roth.Rick Anderson.Shaun Luttin 翻译:江振宇(Kerry Jiang) 校对:许登洋 ...
- Lua 安全调用 metatable 的简单应用
事情的经过 我们的项目中存在好几个战斗界面,不过界面中的内容略有不同.跟同事出去吃饭的时候,他问我.我们现在的战斗界面.有很多是重复的,但是也有偶尔几个地方不太一样.我在战斗过程中驱动这些界面的时候. ...
- 你所不知道的linq(二)
上一篇说了from in select的本质,具体参见你所不知道的linq.本篇说下from...in... from... in... select 首先上一段代码,猜猜结果是什么? class P ...
- C#开发微信门户及应用(16)-微信企业号的配置和使用
在本系列随笔的前面,主要就是介绍微信公众号的门户应用开发,最近把整个微信框架进行了扩展补充,增加了最新的企业号的API封装和开发,后续主要介绍如何利用C#进行微信企业号的开发工作,本篇作为微信企业号的 ...
- Windows下删除.svn文件夹的最简易方法
建立一个文本文件,取名为kill-svn-folders.reg(扩展名由txt改为reg),内容如下: Windows Registry Editor Version 5.00 [HKEY_LOCA ...
- 【译】Core Java Questions and Answers【1-33】
前言 译文链接:http://www.journaldev.com/2366/core-java-interview-questions-and-answers Java 8有哪些重要的特性 Java ...
- 《连载 | 物联网框架ServerSuperIO教程》- 12.服务接口的开发,以及与云端双向交互
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...