1、strcat(dest_str, origin_str)不能追加字符到字符串后
2、把字符串转变为int、float、double等格式。
<stdlib.h>C标准库中的atof()、atoi()等函数:《C primer plus》p312
示例:
3、double类型输入不能用%f,而要用%lf,否则会无法得到正确输入
double a;
scanf(%lf,&a);
printf("%lf\n",a);//会得到正确的答案
scanf("%f",&a);
printf("%lf\n",a);//会得到错误的答案
4、造轮子写生成随机数函数需要注意的:
//1、能直接用rand()就不用造轮子,stdlib.h已经有rand()和srand(),否则可能无法保证随机性
//2、造轮子不要伪随机数列,需要两个函数
#include <time.h>
void srand(){
int next; //种子,但是只在循环外有用,循环内
next = (unsigned int)time(0);
}
void rand0(){
next = next *948219443 +3215;
return (unsigned int )next % 10 + 1
//unsigned int 和 + 1这2个细节很关键,是以后做随机数都可能出现的bug
}
5、读写文件时使用FILE类型指针
//示例:把文件1的内容拷贝到文件2
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 512
/* 读写缓冲区长度,可以依据情况设置不同大小,通常
* 可以依据磁盘的最小单元,设置为4k(4*1024),*/
int main(int argc, char* argv[])
{
FILE *f_src, *f_dest; //知识点1,FILE指针类型。不知道会错
char buff[BUFFER_SIZE];
if(argc != 3)
{
printf("Usage:%s src_file dest_file\n", argv[0]);
exit(EXIT_FAILURE);
}
else
{
if((f_src = fopen(argv[1], "rb")) == NULL)
{
printf("Can't open %s.\n", argv[1]);
exit(EXIT_FAILURE);
}
if((f_dest = fopen(argv[2], "wb")) == NULL)
{
printf("Can't open %s.\n", argv[2]);
exit(EXIT_FAILURE);
}
}
//知识点2,fread()和fwrite()
size_t bytes;
while((bytes = fread(buff,sizeof(char),BUFFER_SIZE,f_src)) > 0)
{/* bytes为fread()成功读取的数据数量,类型为 size_t,保存至缓冲区。*/
fwrite(buff,sizeof(char),bytes,f_dest);
/* 写入缓冲区存储的数据,写入数据量为bytes。 */
}
fclose(f_src);
fclose(f_dest);
return 0;
}
6、fseek()和ftell()的知识点,有助于理解文件内部指针的偏移
\\题目:把一个文件内的所有字符转为大写
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
//这道题非常有价值,值得好好学习
int main(int argc, char* argv[])
{
FILE *fp;
char file_name[80];
char ch;
printf("Input the filename:");
scanf("%s",file_name);
if((fp = fopen(file_name, "r+")) == NULL)
{
printf("Can't open file %s.\n", file_name);
exit(EXIT_FAILURE);
}
//这里的知识点很细节了,标准IO执行读或写操作后,文件内部指针会自动向后偏移1位
while((ch = getc(fp)) != EOF)
/* 读取一个字符,保存至ch变量。*/
{
//printf("before:%ld\n",ftell(fp));
fseek(fp,-sizeof(char),SEEK_CUR);
//printf("after:%ld\n",ftell(fp));
/* 调用fseek函数将文件指针前移一个字符。*/
putc(toupper(ch), fp); //这个操作执行后也会使得指针后移一位
/* 写入转换后字符,覆盖原字符。*/
}
fclose(fp);
return 0;
}
7、puts()和putchar()的区别
puts()打印字符串,putchar()打印字符。今天做一道打印从文件中用getc()读取的输入的题,然后发现总是输出错误的结果,然后才发现原来是误用了puts()函数。
8、fgets()函数一次读取一行,再次执行读取下一行。适合读取文件中类似行读取的场景。