文章目录
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;
}
常见注意事项
- 返回类型:
getchar
返回int
而不是char
,因为它需要能够表示所有可能的字符值和特殊的EOF
值。 - 输入缓冲区:
getchar
从缓冲区读取字符,因此在某些情况下(例如使用scanf
读取输入后),缓冲区中可能残留多余的字符,需要额外处理。 - 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'
。
使用 putchar
和 getchar
结合处理输入和输出
putchar
和 getchar
可以结合使用来处理字符的输入和输出。例如,可以使用 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
输出一个字符串,并在最后输出一个换行符。
常见注意事项
- 返回值:
putchar
返回输出的字符。如果发生错误,返回EOF
。通常情况下,这个返回值可以忽略,但在编写健壮的代码时应检查返回值以处理潜在的错误。 - 字符类型:尽管
putchar
的参数和返回值是int
类型,它实际上用于处理字符(char
类型)。这允许它处理所有可能的字符,包括控制字符。 - 缓冲区:标准输出通常是缓冲的,这意味着输出可能不会立即显示。使用
fflush(stdout)
可以强制刷新缓冲区,将所有缓冲的输出立即显示。
通过理解和正确使用 putchar
,可以有效地控制字符输出,尤其是在处理逐字符的输出需求时。以下是一个综合示例,展示如何使用 getchar
和 putchar
实现字符的输入和输出:
综合示例
#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;
}
在这个示例中,程序读取用户输入的字符并将其回显。如果输入的是换行符,程序将其替换为空格并输出。这样可以演示如何在字符输入和输出过程中处理特殊情况。