ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。
1.71.空白让程序更加美丽,增加可读性。
2.声明只需要编写一次,将他们放在头文件中,避免错误。
就和书的目录一样,需要时#include目录就行,然后需要的内容里面都有,尤其在大型程序时,将不同的函数分别变为模块,调用就用include,程序就会变得井井有条。
3.使用#define给字面常量取值 方便修改 增加可读性
4."%d,%s,%f"
5.
int quantity;
int price;
char department[10] = {0};
scanf("%d %d %s",&quantity,&price,department);
6.C语言不执行下标的有效检查,
因为C语言相信程序员,提高C语言执行效率,通过指针操作更加美丽
7.使用strcpy代替strncpy,在输出空间不够时会出问题
唯一需要注意的就是strcpy可能会复制更多的字符到字符串中,在空间不够的字符串中复制会导致内存泄漏,影响程序中其他的变量。
8while(gets(input) != NULL)
会出现的问题:input输入溢出
使用gets()会出现问题,因为gets不检查越界,当输入的字符比之前预设的多时,gets也会继续执行,但是程序可能会出现内存泄漏的问题,在很多编译器中已经禁止使用gets函数
1.81
#includeint main(int argc, char const *argv[]) { printf("hello worldn"); return 0; }
2
//从标准输入读取几行输入,每行输入都要打印到标准输出上, //前面加上行号,试图让程序输入行的长度没有限制 #include#include int main(int argc, char const *argv[]) { int line = 0; int ch; int at_begining = 1; while((ch = getchar()) != EOF) { if(at_begining == 1) { at_begining = 0; line+=1; printf("%d:",line); } putchar(ch); if(ch == 'n') { at_begining = 1; } } return EXIT_SUCCESS; }
3
//从标准输入读取一些字符,写到标准输出,同时检查checksum,写在字符后面
//checksum(验证) 用一个signed char类型变量进行计算,初始为-1,
//当每个字符从标准输入读取时,他的值被加入到checksum中,如果checksum产生
//溢出,这些溢出被忽略,当所有字符被写入后,程序以十进制整数形式打印checksum
//它有可能是负值,注意在checksum后加一个换行符
#includeint main(int argc, char const *argv[]) { signed char checksum = -1; signed char ch; while((ch = getchar())!= 'n') { putchar(ch); checksum+= ch; } checksum+=ch; putchar('n'); printf("%dn",checksum); return 0; } Hello world! Hello world! 102
4.
//一行行读取输入,直至达到文件末尾。
//算出每行输入行的长度,把最长的那行打印出来
//假定每行输入行不超过1000个字符
#include#include // CRTL + D #define MAX_STRING 1001 int main(int argc, char const *argv[]) { char input[MAX_STRING]; char longest[MAX_STRING]; int len; int longest_len; longest_len = -1; while(gets(input)!= NULL) { len = strlen(input); if(len > longest_len) { longest_len = len; strcpy(longest,input); } } if(longest >= 0) { printf("%d:%sn", longest_len,longest); } return 0; }
1.5当输入行已满,必须终端循环,在其他情况下继续
同时检查每个范围内复制了多少个字符,以防止一个NUL过早复制到缓冲区
#include#include #include #define MAX_COLS 20 #define MAX_INPUT 1000 int read_column_num(int columns[],int max); void rearrange(char *output,char *input,int n_columns,int const columns[]); int main(int argc, char const *argv[]) { int n_columns; int columns[MAX_COLS]; char input[MAX_INPUT]; char output[MAX_INPUT]; n_columns = read_column_num(columns,MAX_COLS); while(gets(input) != NULL) { printf("Original input: %sn", input); rearrange(output,input,n_columns,columns); printf("Rearranged line: %sn",output); } return EXIT_SUCCESS; return 0; } int read_column_num(int columns[],int max) { int num = 0; int ch; while(num < max && scanf("%d",&columns[num]) == 1 && columns[num] >= 0) { num++; } //标号为偶数 if(num %2 != 0) { printf("the last column is not pairedn"); exit(EXIT_FAILURE); } while((ch = getchar())!= EOF && ch != 'n') { ; } return num; } void rearrange(char *output,char *input,int n_columns,int const columns[]) { int col; //columns数组下标 int output_col=0; //输出列计数器 int len; //输入数组长度 len = strlen(input); for(col = 0; col < n_columns; col+=2) { int nchars = columns[col+1] - columns[col] +1; //如果输入行没这么长,跳出这个范围 if( columns[col]>=len) { continue; } //或者 输出数组已满,结束任务 if(output_col == MAX_INPUT-1) { break; } //如果输出行数据不够,只复制可以容纳的 if(output_col + nchars > MAX_INPUT-1) { nchars = MAX_INPUT -1 - output_col; } if(columns[col] + nchars -1 >= len ) { nchars = len - columns[col]; } //复制相关数据 strncpy(output+output_col,input+columns[col],nchars); output_col += nchars; } output[output_col] = ' '; }
1.8.6
题目看不懂
中文版太难懂了



