标准文件

  • C 语言把所有的设备都当作文件。所以设备(比如显示器)被处理的方式与文件相同。

  • 以下三个文件会在程序执行时自动打开,以便访问键盘和屏幕。

三组输入输出函数

  • int scanf(const char *format, ...) 函数从标准输入流 stdin 读取输入,并根据提供的 format 来浏览输入。
  • int printf(const char *format, ...) 函数把输出写入到标准输出流 stdout ,并根据提供的格式产生输出。

  • int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。
  • int putchar(int c) 函数把字符输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。

  • 常带有 warning, 可用 fgets 代替
  • char *fgets(char *str, int n, FILE *stream) 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
  • fgets() 如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针
  • char *gets(char *s) 函数从 stdin 读取一行到 s 所指向的缓冲区,直到一个终止符或 EOF。
  • int puts(const char *s) 函数把字符串 s 和一个尾随的换行符写入到 stdout。

读入变长字符串

读入数字 n, 构建长度为 n 的字符串

  • 读入 n

      int n;
      scanf("%d", &n);
    
      char *str = (char *)malloc((n + 1) * sizeof(char));
      if (str == NULL)
      {
          printf("内存分配失败。\n");
          return 1;
      }
    
  • fgets() 从指定的流 stsream 读取一行,并把它存储在 str 所指向的字符串内

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        // ...
        getchar();
        fgets(str, n + 1, stdin); // n + 1, 则读取 n 个字符后停止
        str[n + 1] = '\0';
        printf("input string is: %s\n", str);
    
        free(str);
        return 0;
    }
    
  • scanf() 直接读取 "%s"

    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        // ...
        scanf("%s", str); // 注意:str本身为指针
        printf("input string is: %s\n", str);
    
        free(str);
        return 0;
    }
    
  • scanf() 读取单个字符后,加入 str 数组

      /**
      * @brief 不推荐此用法 && 换行符会被正常读入,有干扰且代码不优雅
      */
      #include <stdio.h>
      #include <stdlib.h>
      int main()
      {
          // ...
          int index = 0;
          char ch;
    
          getchar(); // 去掉输入缓冲区遗留的'\n'
          while (scanf("%c", &ch) != 0)
          {
              if (ch == '\n') break;
              str[index++] = ch;
          }
    
          *(str + index) = '\0'; // str[index] = '\0';
    
          // tow ways of printf function
          index = 0;
          while (str[index] != '\0') printf("input char is: %c\n", str[index++]);
          printf("input string is: %s\n", str);
    
          free(str);
          return 0;
      }
    
  • getchar() while 读入单个字符(返回为一个整数),加入 str 数组

    /**
     * 数字和字符相互赋值、比较时,会根据ASCII编码进行转化
     */
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
       // ...
        int index = 0;
        int c;
    
        getchar();
        while ((c = getchar()) != '\n')
        {
            str[index++] = c;
        }
        str[index] = '\0';
    
        printf("input string is: %s\n", str);
    
        free(str);
        return 0;
    }