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语言默认的函数调用方法:所有参数从右到左依次入栈