C语言随笔记(一)

自己把一些学习中和使用中的一些点滴有用的记录下来和大家分享。

1.获取指定长度的字符串,或者说为字符串数组获取用户输入的字符
void get_str(char str[], int
len)

{
int
i=0, c;

while
(i<len)

{
c
= getchar();/*这里是防止开始之前用户输入过回车,我们就跳过不处理*/

if
(c == ‘\n‘)

{
if
(!i)

continue;
str[i] =
‘\0‘;

break;
}
str[i++] = c;
}
if
(i == len)

{
if
(c != ‘\n‘)

while (getchar() !=
‘\n‘)

;
str[i]
= ‘\0‘;

}
}
使用举例:
char
str[11];//结尾保存’\0’

get_str(str,sizeof(str)-1);
或者使用如下格式
#define
NAME_CUT 50

char
name[NAME_CUT+1];

get_str(str,NAME_CUT);

添加双引号的宏
#define F(x) _F(x)

#define _F(x)
#x

使用举例:
在这种场景下
#define NAME_CUT
50

char
name[NAME_CUT+1]

我们需要打印name,就可以写成
printf(“%” F(NAME_CUT)
”s\n”,name);

当然真如果出现这种情况,我推荐使用如下宏
#define CUT_FORMAT(x)
_CUT_FORMAT(x)

#define _CUT_FORMAT(x)
“%”#x”s”

使用就改为
printf(CUT_FORMAT(NAME_CUT)
“\n”,name);

推荐的链表的声明格式
typedef
struct
node

{
......
}
NODE;/*数据类型*/
typedef
struct
list

{
NODE
data;

struct
NODE *next;

}
LIST;/*链表类型*/
使用举例
#define
NUM_CUT 10 /*数据中编号最大长度*/

#define
NAME_CUT 20 /*数据中姓名最大字符数*/

typedef
struct
{
char num[NUM_CUT +
1];

char
name[NAME_CUT + 1];

char sex;
char age;
}
STU;/*数据类型*/
typedef
struct
NODE

{
STU
data;

struct
NODE *next;

}
LIST;/*链表类型*/
这种写法非常漂亮,容易扩展

简单的malloc宏,添加了’日志’记录
#define MALLOC(mp)
\

{\
if
(NULL == (mp = malloc(sizeof(*mp)))) \

{\
fputs("内存分配失败,程序退出......",
stderr);\

exit(EXIT_FAILURE);
\

}\
}
使用举例
假设存在如下环境
#define NUM_CUT 10
/*数据中编号最大长度*/

#define NAME_CUT 20
/*数据中姓名最大字符数*/

typedef
struct
{
char
num[NUM_CUT + 1];

char name[NAME_CUT +
1];

char
sex;

char
age;

}
STU;/*数据类型*/
STU *stu;
那么为stu开辟一个空间只需要添加下面的宏语句.
MALLOC(stu);//显然它也存在一个C关于malloc的通病,就是内存不足时,再打印文本也是无法执行的.但是它的原意是日志记录,虽然不一定会记录成功.
再扩展一下MALLOC如下:
#define MALLOC(var)
if(!(var=malloc(sizeof(*var)))){\

fputs("内存申请失败,程序退出中...\n",stderr);\
exit(EXIT_FAILURE);\
}
文件打开的简单宏,添加了’日志’记录
#define FOPEN(file,path,type)
\

{\
if
(NULL == (file = fopen(path, type)))\

{\
fputs("内存不足程序退出中",
stderr);\

exit(EXIT_SUCCESS);\
}\
}
举例
FILE
*file;

FOPEN(file,”work_log.rec”,”rb”);

在控制台上清除输入缓存
while (getchar() !=
‘\n‘)

;
举例
譬如存在如下语句
int
c,num;

printf(“请输入一个整数:”);
scanf(“%d”,&num);
printf(“请再输入一个字符:”);
c=getcahr();
在上面的scanf和getchar之间就存在输入缓存问题,默认getchar()接收的值为’\n’.
这样c获取的值不是我们事先预估的
解决办法就是在二者之间加上
While(getchar()!=’\n’)
  ;
扩展一下,更加严格的应该是这段代码
int ch;
While((ch=getchar())!=EOF&&ch!=’\n’)
  ;
上面的情况是允许用户使用退出getchar()的操作,getchar这个函数在接收错误的时候返回-1,其实就是EOF文件结束标志宏.在window上可以按下Ctrl+Z,Linux上可以按下Ctrl+D达到让getchar函数返回-1的效果,结束当前的输入.
在这里,我采用的设计思路是,要么关闭当前程序,要么就必须输入完整.关键看程序员的想法吧!

关于scanf函数获取用户输入值的一种简便用法
while
(printf(......)

,scanf(......)!=......||......)
{
while
(getchar() != ‘\n‘)

;
puts(......);
}
举例
例如存在如下要求,需要接收用户输入的一个数,这个数必须小于250,大于0
代码如下:
int
num;

while(printf(“请输入一个大于0小于250的整数:”),
  scanf(“%d”,&num)!=1||num<=0||num>=250)
{
  while(getchar()!=’\n’)
  ;
puts(“输入错误,请按照提示重新操作!”);
}
当然有时嫌它代码重复,可以定义如下简单宏
#define CLEAR while (getchar() !=
‘\n‘)/*清除缓存*/

#define CLEARANDMSG
{CLEAR;puts("输入出错,请按照提示重新操作!");}

使用的话就可以写成
int num;
while(printf(“请输入一个大于0小于250的整数:”),
  scanf(“%d”,&num)!=1||num<=0||num>=250)

CLEARANDMSG;

但是上面的代码很丑,关键看自己怎么看了.

关于printf输出格式串%*的用法
#define NAME_CUT
50

char
name[NAME_CUT+1];

printf("%*s\n",NAME_CUT,name);
举例
对于这个技巧,是为了避免一些错误,例如如果name数组中没有’\0’,输出采用%s则会使输出内容不可控.还有一点就是它也统一控制了姓名打印对齐的格式.

比较古老的关于结构体空间声明技巧
typedef
struct
node

{
int
num;

char
name[];

}
NODE;
举例
上面是C99定义包含空数组的结构体,在比较老的时候还存在
typedef
  struct
node

  {
  int
num;

  char
name[1];

  }
NODE;
typedef
  struct
node

  {
  int
num;

  char
name[0];

  }
NODE;
上面两种模式,思路都一致.声明的时候可以写成
int n=10;
NODE
node=malloc(sizeof(NODE)+n);

达到可变数组的目的.(注结构体中
char name[]和char *name,是不同的)

高级简单一点的FOPEN宏的实现
#define FOPEN(file,path,type)
\

FILE
*##file;\

if
(NULL == (##file = fopen(path, type)))\

{\
fputs("内存不足程序退出中",
stderr);\

exit(EXIT_SUCCESS);\
}
举例
如果想将worker_one.rec文件内容复制到worker_two.rec文件中,
创建并打开文件对象的代码就是:
FOPEN(worker_one_file,”worker_one.rec”,”rb”);
FOPEN(worker_two_file,”worker_one.rec”,”wb”);
详细完整的代码如下:
FOPEN(wo_file,”worker_one.rec”,”rb”);
FOPEN(wt_file,”worker_one.rec”,”wb”);
for(int
c;(c=fgetc(wo_file))!=EOF;fputc(c,wt_file))

  ;
fclose(wo_file);
fclose(wt_file);

时间: 2024-12-21 18:46:33

C语言随笔记(一)的相关文章

Perl语言学习笔记 9 正则表达式处理文本

1.替换 s/PATTERN/REPLACE/; #返回是否替换成功的布尔值 可以使用捕获变量,如:s/(\w)/$1/ 匹配失败则不做任何处理 2.定界符 对于没有左右之分的定界符,重复三次即可,如:s///.s### 对于有左右之分的定界符,需使用两对,一对包含模式,一对包含替换字符串,这两对可以不一样,如:s{}{}.s[]{}.s<>[] 3.可选修饰符 /g可进行全局替换,替换所有匹配到的字符串,如:s/ / /g /s:使得 . 匹配所有字符 /i:大小写无关 4.绑定操作符 $f

C语言细节笔记2

C语言常见问题笔记:    1. 指针的声明     char * p1, p2;  p1 是一个指向char类型的指针,而p2是一个char类型变量  这是由于 * 并不是基本类型的一部分,而是包含被声明标识符的声明符的一部分.    2. 储存类型     同一个静态函数或静态变量最好在所有的声明和定义出都包含(static)  extern 作为一个格式上的提示,表明函数的定义可能出现在另一个源文件中  关健字auto毫无用处,已经过时了   3. 在一个文件中定义了一个extern数组,

Perl语言学习笔记 6 哈希

1.哈希的键是唯一的,值可以重复! 2.访问哈希元素 $hashname{"$key"};#哈希为大括号,数组为方括号,键为字符串 $family_name{"fred"} = "firstd";#给哈希元素赋值 3.哈希键支持任意表达式 $foo = "na"; $family_name{$foo."me"};#获取$family_name{"name"}对应的值 4.访问整个哈希 %

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

R语言学习笔记2——绘图

R语言提供了非常强大的图形绘制功能.下面来看一个例子: > dose <- c(20, 30, 40, 45, 60)> drugA <- c(16, 20, 27, 40, 60)> drugB <- c(15, 18, 25, 31, 40) > plot(dose, drugA, type="b") > plot(dose, drugB, type="b") 该例中,我们引入了R语言中第一个绘图函数plot.pl

Go语言学习笔记(一) : 搭建Windows下的Go开发环境

最近突然对Go语言产生了兴趣,主要是因为在使用python的时候遇到了一些不爽的问题,然后发现了Go.Go是Google出的一个动态语言,语法和C++接近,性能也非常的好,而且还支持编译成exe发布,并且不依赖任何虚拟机(其实是打包在exe里面了),这种好语言怎么能够错过?所以便一时兴起,开始学习了起来.由于本人还处于异常小白的阶段,所以文章中可能不免有些错误,欢迎大家各种指正. 安装Go 前往Go语言的官方网站:http://golang.org/, 下载对应平台的安装包.如果是x86的系统可

javascript语言精粹----笔记【转载】

javascript语言精粹----笔记 1.6种值会为假(==false),分别是false,null,undefined,' ',0,NaN 2.typeof有6种值,分别是'number','string','boolean','undefined','function','object';其中typeof(null),结果是'object' 3.number类型总是64位浮点数,两个整数相除也可能出现非整数结果 4.如果第一个运算数的值为假,那么运算符&&产生它的第一个运算数的值.

Perl语言学习笔记 15 智能匹配与give-when结构

1.智能匹配操作符 替代绑定操作符: 在哈希中查找某一个键: 比较两个数组是否完全相同: 查找列表中是否存在某个元素: 智能匹配操作符与顺序无关,~~ 左右元素可以互换 2.智能操作符优先级 3.given语句 相当于c语言的switch语句 4.given可以测试多个条件,在default前用break,否则会导致default一直执行 5.笨拙匹配(正则表达式方式) 6.多个项目的when匹配 可以在语句中间加上其他语句: Perl语言学习笔记 15 智能匹配与give-when结构,布布扣

算法程序设计题语言类笔记

1. 求幂 #include<math.h> //头文件 pow(a,b); //a^b 2. bool #include<stdbool.h> //C中使用bool型需要加入头文件 3. 字符串操作相关 #include<string.h> //头文件 char a[20],b[20]; strcpy(a,b); //把字符串b拷贝到a中 length=strlen(); //求长度 strcmp(a,b); //字符串比较,将a和b中的字符逐个比较,相同继续比较下一

R语言学习笔记

參考:W.N. Venables, D.M. Smith and the R DCT: Introduction to R -- Notes on R: A Programming Environment for Data Analysis and Graphics,2003. http://bayes.math.montana.edu/Rweb/Rnotes/R.html 前言:关于R 在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data