# C 编程：复习题

> 原文：<https://github.com/angrave/SystemProgramming/wiki/C-Programming%3A-Review-Questions>

## 警告 - 问题编号可能会有变化

## 记忆和字符串

## Q1.1

在下面的例子中，哪些变量可以保证打印零值？

```c
int a;
static int b;

void func() {
   static int c;
   int d;
   printf("%d %d %d %d\n",a,b,c,d);
}
```

## 问题 1.2

In the example below, which variables are guaranteed to print the value of zero?

```c
void func() {
   int* ptr1 = malloc( sizeof(int) );
   int* ptr2 = realloc(NULL, sizeof(int) );
   int* ptr3 = calloc( 1, sizeof(int) );
   int* ptr4 = calloc( sizeof(int) , 1);

   printf("%d %d %d %d\n",*ptr1,*ptr2,*ptr3,*ptr4);
}
```

## 问 1.3

在以下尝试复制字符串时解释错误。

```c
char* copy(char*src) {
 char*result = malloc( strlen(src) ); 
 strcpy(result, src); 
 return result;
}
```

## 问题 1.4

为什么以下尝试复制字符串有时会起作用，有时会失败？

```c
char* copy(char*src) {
 char*result = malloc( strlen(src) +1 ); 
 strcat(result, src); 
 return result;
}
```

## Q 1.4

解释以下代码中尝试复制字符串的两个错误。

```c
char* copy(char*src) {
 char result[sizeof(src)]; 
 strcpy(result, src); 
 return result;
}
```

## 问 1.5

以下哪项是合法的？

```c
char a[] = "Hello"; strcpy(a, "World");
char b[] = "Hello"; strcpy(b, "World12345", b);
char* c = "Hello"; strcpy(c, "World");
```

## 问题 1.6

完成函数指针 typedef 以声明一个指向函数的指针，该函数接受 void *参数并返回 void *。将您的类型命名为“pthread_callback”

```c
typedef ______________________;
```

## 问 1.7

除了函数参数之外还有哪些东西存储在线程的栈中？

## 问题 1.8

仅使用`strcpy` `strlen`和指针算法实现`char* strcat(char*dest, const char*src)`的版本

```c
char* mystrcat(char*dest, const char*src) {

  ? Use strcpy strlen here

  return dest;
}
```

## 问题 1.9

使用循环并且没有函数调用来实现 size_t strlen（const char *）的版本。

```c
size_t mystrlen(const char*s) {

}
```

## 问题 1.10

确定以下`strcpy`实现中的三个错误。

```c
char* strcpy(const char* dest, const char* src) {
  while(*src) { *dest++ = *src++; }
  return dest;
}
```

## 印花

## 问 2.1

发现两个错误！

```
fprintf("You scored 100%"); 
```

## 格式化和打印到文件

## 问 3.1

完成以下代码以打印到文件。将名称，逗号和分数打印到文件'result.txt'

```c
char* name = .....;
int score = ......
FILE *f = fopen("result.txt",_____);
if(f) {
    _____
}
fclose(f);
```

## 打印到字符串

## 问 4.1

如何将变量 a，mesg，val 和 ptr 的值打印到字符串？打印 a 为整数，mesg 为 C string，val 为 double val，ptr 为十六进制指针。您可以假设 mesg 指向短 C 字符串（&lt;50 个字符）。额外奖励：您如何使此代码更强大或能够应对？

```c
char* toString(int a, char*mesg, double val, void* ptr) {
   char* result = malloc( strlen(mesg) + 50);
    _____
   return result;
}
```

## 输入解析

## 问 5.1

为什么要检查 sscanf 和 scanf 的返回值？

## 问 5.2

为什么“变得”危险？

## 问 5.3

编写一个使用`getline`的完整程序。确保您的程序没有内存泄漏。

## 堆内存

你什么时候使用 calloc 而不是 malloc？何时 realloc 会有用？

（Todo - 把这个问题移到另一页）程序员在下面的代码中犯了什么错误？是否可以修复它 i）使用堆内存？ ii）使用全局（静态）内存？

```c
static int id;

char* next_ticket() {
  id ++;
  char result[20];
  sprintf(result,"%d",id);
  return result;
}
```