C和指针 第一章
1. 注释不能嵌套,不能过多,合理的注释增加程序的可读性
2.从逻辑上删除一段C代码,更好的办法是使用#if指令
#if 0
statements
#endif
这是一种更为安全的方法。
3.#include <stdio.h>
预处理器用名叫stdio.h的库函数头文件的内容替换#include <stdio.h>语句,其结果就仿佛是stdio.h的内容被逐字写到源文件的那个位置。
如果有一些声明需要用于几个不同的源文件,那么在一个单独的文件中编写这些声明,然后用#include指令把这个文件包含到需要使用这些声明的源文件中。
4.#define 宏定义名一般都大写,用于提醒它们并非普通的变量,而且不能作为左值。宏定义,没有数据类型,也没有类型安全检查,纯文本替换。
5.函数在调用前必须先申明,否则默认返回int型。
6.所有传递给函数的参数都是按值传递的,数组参数是以引用形式进行传递的,但这并不矛盾。在函数中队标量参数的任何修改都会在函数返回时丢失
7.gets()用来从标准设备读入字符并存到参数所指的内存空间,直到出现换行字符或读到文件尾为止,它会丢弃换行符,最后加上NULL作为字符串结束。
8.函数的声明和函数的定义,参数的个数和类型以及函数的返回值都必须是完全匹配,否则编译器会报错。
9.数组作为参数时,不用指定数组的长度。它允许单个函数操纵任意长度的一维数组。The programmer can put in subscript checks where they are needed; in places where the subscript is already known to be correct (for example, from having been checked earlier), there is no overhead expended in checking it again. But the real reason they are omitted is the fact that subscripts are implemented as pointer expressions。
10.scanf函数的返回值是函数成功转换并存储于参数中的值的个数。在使用%s格式码输入字符串时,中间不能包含空白。
12.printf函数的返回值是函数成功打印字符的个数。
13.当你实际上想用&&操作符时,千万不要误用了&操作符。也不要将 == 操作符误用为 = 操作符。
14.C语言可以把赋值操作蕴含于while语句内部,这样就允许程序员消除冗余语句。
例如将
ch = getchar();
while(ch != EOF && ch !='\0')
{
ch = getchar();
}
改为
while( (ch = getchar()) != EOF && ch !='\0');
注意getchar()函数返回整型,所以ch最好声明为int型,EOF也是一个整型值。
15.一行仅包含一个;分号的语句称为空语句,即什么也不做。语法要求这个地方出现一条语句但有无需执行任何任务的时候使用。
16.应该用fgets来代替gets进行字符串的输入。防止输入过长导致数组溢出,fgets指定数组的长度作为参数。
17.在scanf函数的标量参数前必须添加&字符,对于数组名,可加可不加,最好不用加。
18.使用#include指令避免重复声明。这样的好处是声明只需要写一次,以后的维护和修改它时比较容易。同样消除了在多份拷贝中出现写法不一致的机会。
19.使用#define指令给常量值取名。It is easier to see what a named constant represents, if it is well named, than a literal constant,
which merely displays its value.
20.在#include文件中放置函数的原型。
21.在使用下标时先检查它们的值。
22.在while或if表达式中蕴含赋值操作。
23.学会使用空语句,编写一个空循环体。
24.始终要进行检查,确保数组不越界。
25.良好的编程风格便于程序的理解与维护。To make the program easier to read, which in turn makes it easier to maintain later.
26.对于int main(int argc,char *argv[])函数的两个参数argc,argv,
argc就是命令参数个数,argv就是各个命令参数。
在VC上基本用不到这个两个参数,例如下面的程序
#include<stdio.h>
int main(int argc,char *argv[])
{
for( int i=0; i<argc; ++i )
{
printf("argv[%d]: %s\n",i,argv[i]);
}
return 0;
}
保存test.c然后编译成test.exe,拷贝test.exe到目录D:/,然后在运行中输入cmd打开命令窗口,输入D:回车定位到d:根目录下,输入 test.exe 1 hello 3 456,中间用空格隔开,看看输出结果,一下子就明白了。
-
#include <stdio.h>
-
#include <stdlib.h>
-
#include <string.h>
-
-
/*宏定义,没有数据类型,也没有类型安全检查,纯文本替换*/
-
#define MAX_COLS 20 /*所能处理的最大列号*/
-
#define MAX_INPUT 1000 /*每个输入行的最大长度*/
-
-
/*函数在调用前先申明,否则默认返回int型*/
-
int read_column_numbers(int columns[], int max);
-
void rearrange(char *output, char const *input,
-
int n_columns, int const columns[]);
-
/*注意缩进风格,const修饰,希望数据不被程序员修改*/
-
-
int main(void)
-
{
-
int n_columns; /*进行处理的列标号*/
-
int columns[MAX_COLS]; /*需要处理的列数*/
-
char input[MAX_INPUT]; /*容纳输入行的数组*/
-
char output[MAX_INPUT]; /*容纳输出行的数组*/
-
-
n_columns = read_column_numbers(columns,MAX_COLS);
-
/*读取,处理和打印剩余的输入行*/
-
while (gets(input) != NULL)
-
{//gets()用来从标准设备读入字符并存到参数所指的内存空间,直到出现换行字符或读到文件尾为止,最后加上NULL作为字符串结束。
-
printf("Original input : %s\n", input);/*打印输入字符串*/
-
rearrange(output, input,n_columns, columns);/*处理字符串*/
-
printf("Rearranged line: %s\n", output); /*输出处理后的字符串*/
-
}
-
-
return EXIT_SUCCESS;
-
}
-
-
int read_column_numbers(int columns[], int max)
-
{/*将列标号保存在数组columns里*/
-
int num = 0;
-
int ch;
-
-
/*取得列标号,如果所读取的数小于0则停止*/
-
while ( (num < max) && scanf("%d",&columns[num]) == 1
-
&& columns[num] >= 0)
-
/*scanf函数的返回值是函数成功转换并存储于参数中的值的个数*/
-
{
-
num +=1;
-
}
-
-
/*确认已经读取的标号为偶数个,因为它们是以对的形式出现的.*/
-
-
if (num % 2 != 0)
-
{
-
puts("Last column number is not paired.");
-
exit(EXIT_FAILURE);
-
}
-
-
/*丢弃该行中包含最后一个数字的那部分内容.
-
while循环将读取并丢弃这些剩余的字符,防止它们被解释为第1行的数据
-
例如输入 5 6 -1 1 2 3 4 5 7 回车,那么 -1 后面的字符应该被丢弃*/
-
-
while ( (ch = getchar() ) != EOF && ch != '\n')
-
;
-
-
return num;/*返回列标号的个数*/
-
}
-
-
/*处理输入行,将指定列的字符连接在一起,输出行以NUL结尾*/
-
-
void rearrange(char *output, char const *input,
-
int n_columns, int const columns[])
-
{
-
int col; /*columns数组的下标*/
-
int output_col; /*输出列计数器*/
-
int len; /*输入行的长度*/
-
-
len = strlen(input);
-
output_col = 0;
-
-
/*处理每对列标号*/
-
for (col = 0; col < n_columns; col += 2)
-
{
-
int nchars = columns[col+1] - columns[col] + 1; /*取字符的个数*/
-
/*如果输入行结束或输出行数组已满,就结束任务.*/
-
-
if (columns[col] >= len ||
-
output_col == MAX_INPUT - 1)
-
{
-
break;
-
}
-
-
/*如果输出行数据空间不够,只复制可以容纳的数据.*/
-
-
if (output_col + nchars > MAX_INPUT - 1)
-
{
-
nchars = MAX_INPUT - output_col - 1;
-
}
-
-
/*复制相关的数据.*/
-
strncpy(output + output_col, input + columns[col], nchars);
-
output_col += nchars;
-
}
-
-
output[output_col] = '\0';
-
}
-
-
-
-
文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq523176585/article/details/12447737
- 点赞
- 收藏
- 关注作者
评论(0)