C语言学习BUG与细节集合

1、strcat(dest_str, origin_str)不能追加字符到字符串后


image.png

2、把字符串转变为int、float、double等格式。
C标准库中的atof()、atoi()等函数:《C primer plus》p312
示例:


注意atof(char *pt)实际上转换成的结果是double类型

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 
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 
#include 
#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 
#include 
#include 
//这道题非常有价值,值得好好学习
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()函数一次读取一行,再次执行读取下一行。适合读取文件中类似行读取的场景。


fgets()测试

sample里的内容

你可能感兴趣的:(C语言学习BUG与细节集合)