Write和Read
STDIN_FILENO:接收键盘的输入
STDOUT_FILENO:向屏幕输出
接收用户在屏幕上输入的数据,并在屏幕上输出(要求使用read和wirte实现),用户输入quit就退出程序。
graph LR
键盘-->|输入|程序
程序-->|输出|屏幕
代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *args[]) {
char buf_read[1024];
char buf_write[1024];
while (1) {
memset(buf_read, 0, sizeof(buf_read));// 将buf_read全部设为0
memset(buf_write, 0, sizeof(buf_write));
char input_message[100] = "input some words : ";
write(STDOUT_FILENO, input_message, sizeof(input_message));
read(STDIN_FILENO, buf_read, sizeof(buf_read));// 读取用户的键盘输入信息
if (strncmp(buf_read, "quit", 4) == 0) {
break;
}
strcpy(buf_write, buf_read);
char output_message[100] = "output some words : ";
write(STDOUT_FILENO, output_message, sizeof(output_message));
write(STDOUT_FILENO, buf_write, strlen(buf_write));// 将信息显示在屏幕上
}
return 0;
}
编译
gcc main.c -o main
最后的结果
./main
input some words : 123
output some words : 123
input some words : 123
output some words : 123
input some words : 434
output some words : 434
input some words : 33434
output some words : 33434
atoi函数
将字符串转换为数字类型
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int n;
char *str = "12345.67";
n = atoi(str);
printf("n=%d\n",n);//%d要求输入的数字类型
return 0;
}
setbuf函数
C 库函数 int setvbuf(FILE *stream, char *buffer, int mode, size_t size)
定义流 stream 应如何缓冲。
#include <stdio.h>
int main()
{
char buff[1024];
memset( buff, '\0', sizeof( buff ));
fprintf(stdout, "启用全缓冲\n");
setvbuf(stdout, buff, _IOFBF, 1024);
fprintf(stdout, "这里是 runoob.com\n");
fprintf(stdout, "该输出将保存到 buff\n");
fflush( stdout );
fprintf(stdout, "这将在编程时出现\n");
fprintf(stdout, "最后休眠五秒钟\n");
sleep(5);
return(0);
}
参数说明
_IOFBF:全缓冲
_IOLBF:行缓冲
_IONBF:无缓冲
让我们编译并运行上面的程序,这将产生以下结果。在这里,程序把缓冲输出保存到 buff,直到首次调用 fflush() 为止,然后开始缓冲输出,最后休眠 5 秒钟。它会在程序结束之前,发送剩余的输出到 STDOUT。
启用全缓冲
这里是 runoob.com
该输出将保存到 buff
这将在编程时出现
最后休眠五秒钟
read和write函数的参数说明
向屏幕输出write():write(int fd,const void*buf,size_t count);
- fd:是文件描述符(write所对应的是写,即就是1)
- buf:通常是一个字符串,需要写入的字符串
- count:是每次写入的字节数
向内存中存入read(int fd,void*buf,size_t count)
- fd:是文件描述符(read所对应的文件描述符为0)
- buf:为读出数据的缓冲区;
- count:为每次读取的字节数
memcpy函数
void *memcpy(void *str1, const void *str2, size_t n)
- str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
- str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
- n – 要被复制的字节数。
该函数返回一个指向目标存储区 str1 的指针。
scanf函数
C 库函数 int scanf(const char *format, …) 从标准输入 stdin 读取格式化输入。
int scanf(const char *format, ...)
实例
#include <stdio.h>
int main()
{
char str1[20], str2[30];
printf("请输入用户名:");
scanf("%s", str1);
printf("请输入您的网站:");
scanf("%s", str2);
printf("输入的用户名:%s\n", str1);
printf("输入的网站:%s", str2);
return(0);
}
注意:scanf("%d%*c", &size); //就是读取一个整数后,丢弃紧跟在整数后边的一个字符
fgets()
char *fgets(char *str, int n, FILE *stream)
- str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
- n – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
- stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
#include <stdio.h>
int main()
{
FILE *fp;
char str[60];
/* 打开用于读取的文件 */
fp = fopen("file.txt" , "r");
if(fp == NULL) {
perror("打开文件时发生错误");
return(-1);
}
if( fgets (str, 60, fp)!=NULL ) {
/* 向标准输出 stdout 写入内容 */
puts(str);
}
fclose(fp);
return(0);
}
puts()
int puts(const char *str)
把一个字符串写入到标准输出 stdout,直到空字符,但不包括空字符。换行符会被追加到输出中。例如
#include <stdio.h>
#include <string.h>
int main()
{
char str1[15];
char str2[15];
strcpy(str1, "RUNOOB1");
strcpy(str2, "RUNOOB2");
puts(str1);
puts(str2);
return(0);
}
“»=,«=,&=,^=,|=”
C语言中的 »= 意思为:右移后赋值
x = 8;
x >>= 3;
右移后结果为:00000000 00000000 00000000 00000001
C语言中的 «= 意思为:左移后赋值
x = 8;
x <<= 3;
左移后赋值结果为:00000000 00000000 00000000 01000000
C语言中的 &= 意思为:按位与后赋值
x = 0x02;
x &= 0x01;
按位与后的结果为:0x00
C语言中的 ^= 意思为:按位异或后赋值
x = 0x02;
x ^= 0x01;
按位异或的结果为:0x03 等同于0011
C语言中的 |= 意思为:按位或后赋值
x = 0x02;
x |= 0x01;
MK_FP
MK_FP是一个宏。功能是做段基址加上偏移地址的运算,也就是取实际地址。
atol()
把字符串转换成长整型数.这个函数返回转换后的整数倍,作为一个长整型。如果没有有效的转换可以执行,它返回零。
alloc()
malloc 和 calloc 之间的不同点是,malloc 不会设置内存为零,而 calloc 会设置分配的内存为零。calloc 会将分配的内存空间每一位都初始化为 0,所以也不能通过分配和释放几个小 chunk,再分配一个大 chunk,来泄露其内容。
strtol函数
strtol是一个C语言函数,作用就是将一个字符串转换为长整型long,其函数原型为:long int strtol (const char* str, char** endptr, int base);
,其中
- str是要转换的字符
- enptr是指向第一个不可转换的字符位置的指针
- base的基数,表示要转换的是几进制的数
例子
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str[30] = "2030300 This is test";
char *ptr;
long ret;
ret = strtol(str, &ptr, 10);
printf("数字(无符号长整数)是 %ld\n", ret);
printf("字符串部分是 |%s|", ptr);
return(0);
}
结果
数字(无符号长整数)是 2030300
字符串部分是 | This is test|
__cdecl
表示C语言默认的函数调用方法:所有参数从右到左依次入栈