2.标准输入输出

2.1 scanf和printf输入/输出

2.1.1 scanf

scanf中char数组整个输入的情况下不加&之外,其他都要加&
当然,下面是一个表格,详细列出了常见的scanf格式符及其说明和示例:

格式符说明示例
%d读取有符号十进制整数int a; scanf("%d", &a);
%i读取有符号整数(可识别八进制和十六进制)int a; scanf("%i", &a);
%u读取无符号十进制整数unsigned int a; scanf("%u", &a);
%o读取无符号八进制整数unsigned int a; scanf("%o", &a);
%x / %X读取无符号十六进制整数unsigned int a; scanf("%x", &a);
%c读取单个字符char ch; scanf("%c", &ch);
%s读取字符串(遇到空白字符停止)char str[100]; scanf("%s", str);
%f读取浮点数(float类型)float f; scanf("%f", &f);
%lf读取双精度浮点数(double类型)double d; scanf("%lf", &d);
%Lf读取长双精度浮点数(long double类型)long double ld; scanf("%Lf", &ld);
%p读取指针地址void *ptr; scanf("%p", &ptr);
%[]扫描集合,读取符合集合条件的字符序列char str[100]; scanf("%[a-z]", str);
%[^]扫描非集合,读取不符合集合条件的字符序列char str[100]; scanf("%[^0-9]", str);
宽度限制和跳过输入
格式符说明示例
%<宽度>d指定宽度限制读取整数int a; scanf("%3d", &a);
%*d跳过一个整数输入字段int a; scanf("%*d %d", &a);
%c跳过空白字符,读取单个字符char ch; scanf(" %c", &ch);
组合示例

以下是一个综合示例,演示如何使用各种格式符读取不同类型的数据:

#include <stdio.h>

int main() {
    int num;
    float fnum;
    char ch;
    char str[20];
    void *ptr;
    
    printf("Enter an integer: ");
    scanf("%d", &num);
    
    printf("Enter a float: ");
    scanf("%f", &fnum);
    
    printf("Enter a character: ");
    scanf(" %c", &ch);
    
    printf("Enter a string: ");
    scanf("%19s", str);
    
    printf("Enter a pointer (hex format): ");
    scanf("%p", &ptr);
    
    printf("You entered: %d, %f, %c, %s, %p\n", num, fnum, ch, str, ptr);
    
    return 0;
}

运行这个程序,用户可以依次输入一个整数、一个浮点数、一个字符、一个字符串和一个指针地址,程序将会按格式输出这些输入值。

在C语言中,printf函数用于格式化输出。通过使用各种格式说明符,可以控制输出的格式和内容。以下是常见的printf格式符及其说明和示例:

2.1.2 printf基本格式符

格式符说明示例
%d以有符号十进制整数形式输出printf("%d", 123);
%i以有符号十进制整数形式输出printf("%i", 123);
%u以无符号十进制整数形式输出printf("%u", 123);
%o以无符号八进制形式输出printf("%o", 123);
%x以无符号十六进制形式输出(小写)printf("%x", 123);
%X以无符号十六进制形式输出(大写)printf("%X", 123);
%f以十进制浮点数形式输出printf("%f", 123.456);
%e以科学计数法输出(小写e)printf("%e", 123.456);
%E以科学计数法输出(大写E)printf("%E", 123.456);
%g自动选择使用普通浮点数或科学计数法(小写)printf("%g", 123.456);
%G自动选择使用普通浮点数或科学计数法(大写)printf("%G", 123.456);
%c以字符形式输出printf("%c", 'A');
%s以字符串形式输出printf("%s", "Hello");
%p以指针地址形式输出int a = 5; printf("%p", &a);
%%输出百分号printf("%%");
宽度和精度控制
格式符说明示例
%5d指定最小宽度为5的有符号十进制整数printf("%5d", 123);
%-5d指定最小宽度为5且左对齐的有符号十进制整数printf("%-5d", 123);
%05d指定最小宽度为5且用零填充的有符号十进制整数printf("%05d", 123);
%.2f指定小数点后两位的浮点数printf("%.2f", 123.456);
%8.2f指定最小宽度为8且小数点后两位的浮点数printf("%8.2f", 123.456);
%-8.2f指定最小宽度为8且小数点后两位的左对齐浮点数printf("%-8.2f", 123.456);
%*.*f动态指定宽度和精度的浮点数printf("%*.*f", 8, 2, 123.456);
示例代码

下面是一些示例代码,展示如何使用各种格式符:

整数输出

#include <stdio.h>

int main() {
    int num = 123;
    printf("Default: %d\n", num);
    printf("Width 5: %5d\n", num);
    printf("Width 5, left align: %-5d\n", num);
    printf("Width 5, zero fill: %05d\n", num);
    return 0;
}

浮点数输出

#include <stdio.h>

int main() {
    float num = 123.456;
    printf("Default: %f\n", num);
    printf("Precision 2: %.2f\n", num);
    printf("Width 8, precision 2: %8.2f\n", num);
    printf("Width 8, precision 2, left align: %-8.2f\n", num);
    return 0;
}

字符串和字符输出

#include <stdio.h>

int main() {
    char ch = 'A';
    char str[] = "Hello";
    printf("Character: %c\n", ch);
    printf("String: %s\n", str);
    return 0;
}

指针输出

#include <stdio.h>

int main() {
    int num = 123;
    printf("Pointer: %p\n", &num);
    return 0;
}

百分号输出

#include <stdio.h>

int main() {
    printf("Percent sign: %%\n");
    return 0;
}
总结
  • printf的格式符可以用于各种类型的输出,包括整数、浮点数、字符、字符串和指针。
  • 通过控制宽度和精度,可以定制输出的格式。
  • 了解并熟练使用这些格式符,可以使输出更加清晰和专业。

2.2 getchar和putchar 输入/输出

2.2.1 getchar

getchar 是一个标准C库函数,用于从标准输入(通常是键盘)读取一个字符。它的原型在头文件 stdio.h 中声明:

int getchar(void);

getchar 的使用非常简单,但在处理输入时有一些重要的细节需要注意。以下是对 getchar 的详细说明,包括示例代码和一些常见的注意事项。

getchar 基本用法

getchar 函数从标准输入读取下一个可用字符,并返回该字符的 ASCII 码。如果遇到文件结尾或发生读取错误,则返回 EOF

基本示例:

#include <stdio.h>

int main() {
    int c;

    printf("Enter a character: ");
    c = getchar();  // 从标准输入读取一个字符

    printf("You entered: %c\n", c);

    return 0;
}

getchar 用于读取多个字符

getchar 通常用于读取字符流,例如处理逐个字符的输入,直到遇到某个特定字符(如换行符)或文件结束。

示例:读取一行输入

#include <stdio.h>

int main() {
    int c;
    printf("Enter a line of text (press Enter to finish):\n");

    while ((c = getchar()) != '\n' && c != EOF) {
        putchar(c);  // 将读取的字符输出
    }

    printf("\nEnd of input.\n");
    return 0;
}

在这个示例中,程序会读取用户输入的每个字符,直到遇到换行符或文件结尾,并将这些字符逐个输出。

处理输入中的空白字符

getchar 会读取输入中的所有字符,包括空白字符(如空格、制表符、换行符)。在处理输入时,可能需要跳过某些空白字符。

示例:跳过输入中的空白字符

#include <stdio.h>
#include <ctype.h>

int main() {
    int c;
    printf("Enter text (press Enter to finish):\n");

    while ((c = getchar()) != '\n' && c != EOF) {
        if (!isspace(c)) {  // 跳过空白字符
            putchar(c);  // 输出非空白字符
        }
    }

    printf("\nEnd of input.\n");
    return 0;
}

getchar 与缓冲区

getchar 会从输入缓冲区读取字符,这意味着如果输入缓冲区中已经有数据,getchar 会立即返回一个字符而不会等待用户输入。

示例:读取一个字符并等待用户按下 Enter 键

#include <stdio.h>

int main() {
    int c;

    printf("Press any key to continue...\n");
    c = getchar();  // 读取一个字符
    printf("You pressed: %c\n", c);

    // 等待用户按下 Enter 键
    while ((c = getchar()) != '\n' && c != EOF) {
        // do nothing, just consume the characters
    }

    return 0;
}

在这个示例中,程序首先读取一个字符并输出,然后进入一个循环,直到用户按下 Enter 键。这确保了用户输入不会意外中断后续的程序执行。

getchar 读取控制字符

getchar 可以用于读取控制字符,如 Ctrl+D(表示文件结束)或 Ctrl+C(中断程序)。

示例:检测文件结束符

#include <stdio.h>

int main() {
    int c;
    printf("Enter text (press Ctrl+D to end input):\n");

    while ((c = getchar()) != EOF) {
        putchar(c);  // 将读取的字符输出
    }

    printf("\nEnd of input.\n");
    return 0;
}

常见注意事项

  1. 返回类型getchar 返回 int 而不是 char,因为它需要能够表示所有可能的字符值和特殊的 EOF 值。
  2. 输入缓冲区getchar 从缓冲区读取字符,因此在某些情况下(例如使用 scanf 读取输入后),缓冲区中可能残留多余的字符,需要额外处理。
  3. EOF 检查:在使用 getchar 时,务必检查返回值是否为 EOF,以正确处理文件结束或读取错误。

通过理解和正确使用 getchar,可以更有效地处理字符输入和逐字符处理需求。

2.2.2 putchar

putchar 是一个标准C库函数,用于将一个字符写入标准输出(通常是屏幕)。它的原型在头文件 stdio.h 中声明:

int putchar(int c);

putchar 基本用法

putchar 接受一个字符(以 int 形式传递)作为参数,并将其输出到标准输出。如果输出成功,它会返回相同的字符;如果发生错误,它会返回 EOF

基本示例:

#include <stdio.h>

int main() {
    char ch = 'A';
    putchar(ch);  // 输出字符 'A'
    putchar('\n');  // 输出换行符
    return 0;
}

putchar 用于输出多个字符

putchar 通常用于输出字符流。例如,可以用它来逐个输出一个字符串的每个字符。

示例:输出一个字符串

#include <stdio.h>

int main() {
    char str[] = "Hello, World!";
    int i = 0;

    while (str[i] != '\0') {
        putchar(str[i]);
        i++;
    }

    putchar('\n');  // 输出换行符
    return 0;
}

在这个示例中,程序使用 putchar 输出字符串中的每个字符,直到遇到字符串终止符 '\0'

使用 putchargetchar 结合处理输入和输出

putchargetchar 可以结合使用来处理字符的输入和输出。例如,可以使用 getchar 读取用户输入的字符,然后使用 putchar 将其输出。

示例:回显用户输入

#include <stdio.h>

int main() {
    int c;

    printf("Enter text (press Ctrl+D to end input):\n");

    while ((c = getchar()) != EOF) {
        putchar(c);  // 回显用户输入的字符
    }

    printf("\nEnd of input.\n");
    return 0;
}

在这个示例中,程序不断读取用户输入的字符并将其输出,直到遇到文件结束符(Ctrl+D)。

处理特殊字符

putchar 可以用于输出各种字符,包括控制字符和特殊字符。常见的控制字符有换行符 '\n'、制表符 '\t' 等。

示例:输出特殊字符

#include <stdio.h>

int main() {
    putchar('H');
    putchar('e');
    putchar('l');
    putchar('l');
    putchar('o');
    putchar(',');
    putchar(' ');
    putchar('W');
    putchar('o');
    putchar('r');
    putchar('l');
    putchar('d');
    putchar('!');
    putchar('\n');  // 输出换行符

    return 0;
}

在这个示例中,程序使用 putchar 输出一个字符串,并在最后输出一个换行符。

常见注意事项

  1. 返回值putchar 返回输出的字符。如果发生错误,返回 EOF。通常情况下,这个返回值可以忽略,但在编写健壮的代码时应检查返回值以处理潜在的错误。
  2. 字符类型:尽管 putchar 的参数和返回值是 int 类型,它实际上用于处理字符(char 类型)。这允许它处理所有可能的字符,包括控制字符。
  3. 缓冲区:标准输出通常是缓冲的,这意味着输出可能不会立即显示。使用 fflush(stdout) 可以强制刷新缓冲区,将所有缓冲的输出立即显示。

通过理解和正确使用 putchar,可以有效地控制字符输出,尤其是在处理逐字符的输出需求时。以下是一个综合示例,展示如何使用 getcharputchar 实现字符的输入和输出:

综合示例

#include <stdio.h>

int main() {
    int c;

    printf("Enter text (press Ctrl+D to end input):\n");

    while ((c = getchar()) != EOF) {
        if (c == '\n') {
            putchar(' ');  // 将换行符替换为空格
        } else {
            putchar(c);  // 输出字符
        }
    }

    printf("\nEnd of input.\n");
    return 0;
}

在这个示例中,程序读取用户输入的字符并将其回显。如果输入的是换行符,程序将其替换为空格并输出。这样可以演示如何在字符输入和输出过程中处理特殊情况。

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值