#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { /* printf(格式化输出): %[标志][输出最小宽度][.精度][长度]格式字符串 标志 含义 - 左对齐,右边填空格 + 输出符号(正好或者负号) 空格 值为正,冠以空格;为负,冠以负号 # 输出八进制十六进制的时候加前缀 scanf(格式化输入): 格式化说明符与printf()中的格式说明符基本相同 空白字符:在读操作中略去输入中的一个或者多个空白字符 非空白字符:在输入中剔除与这个非空白字符相同的字符 !!!连续的读入注意在scanf末尾加上'/n' */ FILE *fp; char buffer_write[100] = "This is a test"; if((fp = fopen("d://example.txt", "w")) == 0) { printf("open failed!"); return 0; } fwrite(buffer_write, 1, strlen("This is a test"), fp); fclose(fp); char buffer_read[100]; if((fp = fopen("d://example.txt", "r")) == 0) { printf("open failed!"); return 0; } fseek(fp, 0L, SEEK_END); int len = ftell(fp); fseek(fp,0,SEEK_SET); fread(buffer_read, 1, len , fp); /* 原因是我们在fwrite函数时写入的字节数是用strlen求得的,也就是说字符串最后的'/0'并没有写到文件中去。 所以我们从文件中读到buffer中时也自然没有'/0',因为buffer_read中的数是随机的 除非buffer中最后一个字符的下一个数恰好随机到0,否则以%s将buffer_read中的字符输出时遇不到0,所以乱码产生 可以在向文件写数据时多写入一个字节,系统会自动写入0, fwrite(buffer_write, 1, strlen("This is a test")+1, fp);这样读出时最后就有一个0了。 或者读出操作完成后,在最后一个字符后面补上一个0:buffer_read[len] = 0;这样问题也可得到解决。 */ buffer_read[len] = 0; printf("%.4s/n",buffer_read); printf("%-10s/n","hha"); fclose(fp); /* 定义函数: void *memcpy(void *dest, const void *src, size_t n) 与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'/0'而结束 */ char a[30] = "string (a)"; char b[30] = "hi/0zengxiaolong"; int i; strcpy(a, b); //a[30] = "hi/0ing (a)" printf("strcpy():"); for(i = 0; i < 30; i++) printf("%c", a[i]); //hi ing (a) memcpy(a, b, 30); //a[30] = "hi/0zengxiaolong" printf("/nmemcpy():"); for(i = 0; i < 30; i++) printf("%c", a[i]); //hizengxiaolong printf("/n"); /* 定义函数: void *memccpy(void *dest, const void *src, int c, size_t n); memccpy()用来拷贝src所指的内存内容前n个字节到dest所指的地址上。 与memcpy()不同的是,memccpy()如果在src中遇到某个特定值(int c)立即停止复制。 返回值:返回指向dest中值为c的下一个字节指针。 返回值为0表示在src所指内存前n个字节中没有值为c的字节。 */ strcpy(a,"string[a]aa"); strcpy(b,"string(b)bb"); memccpy(a, b, 'b', sizeof(b)); //a[] = "string(b]" printf("memccpy():%s/n", a); system("PAUSE"); return 0; }