Skip to content

Files

Latest commit

439dcc7 · May 9, 2020

History

History
200 lines (136 loc) · 3.63 KB

83.md

File metadata and controls

200 lines (136 loc) · 3.63 KB

C 编程:复习题

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

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

记忆和字符串

Q1.1

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

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?

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

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

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

问题 1.4

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

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

Q 1.4

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

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

问 1.5

以下哪项是合法的?

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”

typedef ______________________;

问 1.7

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

问题 1.8

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

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

  ? Use strcpy strlen here

  return dest;
}

问题 1.9

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

size_t mystrlen(const char*s) {

}

问题 1.10

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

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

印花

问 2.1

发现两个错误!

fprintf("You scored 100%"); 

格式化和打印到文件

问 3.1

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

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 字符串(<50 个字符)。额外奖励:您如何使此代码更强大或能够应对?

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)使用全局(静态)内存?

static int id;

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