1 结束符"\0"与输入输出函数
1.1 结束符"\0"
在 C 语言中,字符串并不是一个单独的数据类型,而是一个字符数组。字符串的结束是通过一个特殊的字符来标识的,这个字符就是"\0"(null 字符)。
例如,字符串 "hello" 在内存中实际上是存储为 {'h', 'e', 'l', 'l', 'o', '\0'}。
- 标识字符串结束:'\0' 告诉程序字符串的结束位置。没有这个结束符,程序在处理字符串时将无法确定何时停止读取字符,可能会导致读取未定义的内存区域。
- 字符串函数:许多 C 标准库函数(如 strlen、strcpy、printf 等)依赖于"\0"来确定字符串的长度或进行复制。
代码示例:如何使用字符串和"\0"
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "Hello"; // 自动添加 '\0'
char str2[6]; // 预留空间
// 手动赋值并添加结束符
str2[0] = 'H';
str2[1] = 'e';
str2[2] = 'l';
str2[3] = 'l';
str2[4] = 'o';
str2[5] = '\0'; // 添加结束符
// 打印字符串
printf("str1: %s\n", str1);
printf("str2: %s\n", str2);
printf("Length of str1: %lu\n", strlen(str1)); // 计算字符串长度
return 0;
}
1.2 输入函数
在 C 语言中,常用的输入函数主要有 scanf、getchar和fgets函数。它们用于从标准输入(通常是键盘)读取数据。
三种输入函数与结束符 \0 的关系:
- scanf 和 fgets 会在读取字符串后自动添加 \0,使字符串能够正确地被其他字符串处理函数识别。
- getchar 逐个读取字符,不会自动添加 \0,需要手动处理。
- 在处理字符串时,确保在适当的位置添加 \0,以防止未定义行为和内存错误。
三种输入函数输入结束条件:
- scanf:以空格、制表符、换行符或输入流结束作为结束条件。
- getchar:以换行符或输入流结束作为结束条件。
- fgets:以换行符、字符数限制或输入流结束作为结束条件。
1.2.1 scanf函数
scanf 是最常用的输入函数,能够读取格式化的数据。
int scanf(const char *format, ...);
参数:
- format:格式字符串,指定输入数据的类型和格式。
- ...:变量地址,用于存储输入的数据。
代码示例:
#include <stdio.h>
int main()
{
int age;
float height;
printf("请输入你的年龄:");
scanf("%d", &age); // 读取整数
printf("请输入你的身高:");
scanf("%f", &height); // 读取浮点数
printf("年龄:%d,身高:%.2f\n", age, height);
return 0;
}
1.2.2 getchar 函数
getchar 用于读取单个字符。
int getchar(void);
代码示例:
#include <stdio.h>
int main()
{
char ch;
printf("请输入一个字符:");
ch = getchar(); // 读取一个字符
printf("你输入的字符是:%c\n", ch);
return 0;
}
注意:
- getchar 读取的是下一个字符,包括空格和换行。
- 如果需要读取多个字符,可以在循环中使用 getchar。
1.2.3 fgets 函数
fgets 用于读取一行字符串,通常用于处理字符数组。
char *fgets(char *str, int n, FILE *stream);
参数
- str:存储输入字符串的字符数组。
- n:要读取的最大字符数,包括结束符。
- stream:输入流,通常为 stdin。
代码示例:
#include <stdio.h>
int main()
{
char name[50];
printf("请输入你的名字:");
fgets(name, sizeof(name), stdin); // 读取一行字符串
printf("你好,%s", name);
return 0;
}
注意:
- fgets 会读取换行符,存储在数组中。如果不想要换行符,可以手动去除。
- fgets 更安全,因为它限制了读取的字符数,避免缓冲区溢出。
1.3 输出函数
在 C 语言中,常用的输出函数主要包括 printf、puts和putchar函数。
1.3.1 printf 函数
功能:格式化输出,可以输出各种数据类型(整数、浮点数、字符、字符串等)
int printf(const char *format, ...);
参数:
- format:格式字符串,包含文本和格式说明符(如 %d、%f、%s 等)。
- 后续参数:根据格式字符串中的说明符提供对应的值。
代码示例:
int a = 10;
float b = 5.5;
char str[] = "Hello, World!";
printf("整数:%d\n", a); // 输出整数
printf("浮点数:%.2f\n", b); // 输出浮点数,保留两位小数
printf("字符串:%s\n", str); // 输出字符串
1.3.2 puts 函数
功能:输出字符串,并自动在末尾添加换行符。
int puts(const char *str);
参数:
- str:要输出的字符串。
代码示例:
#include <stdio.h>
int main()
{
// 定义一个字符串数组
const char *messages[] =
{
"Welcome to the program!",
"Here are some important messages:",
"1. Stay focused.",
"2. Keep learning.",
"3. Enjoy the process."
};
// 使用 puts 输出每个字符串
for (int i = 0; i < 5; i++)
{
puts(messages[i]);
}
// 提示用户输入
puts("Press Enter to exit...");
getchar(); // 等待用户按下回车
return 0;
}
1.3.3 putchar 函数
用于向标准输出(通常是屏幕)写入一个字符。
int putchar(int char);
参数:char: 要输出的字符,以 int 类型传递。通常是一个字符的 ASCII 值。
返回值:
- 成功时返回输出的字符。
- 如果发生错误,返回 EOF(通常为 -1)。
代码示例:
#include <stdio.h>
int main()
{
char c = 'A';
// 使用 putchar 输出字符
putchar(c);
// 输出换行符
putchar('\n');
return 0;
}
1.3.4 输出进制转换
代码示例:将输入的十进制数分别用八进制和十六进制进行输出。
#include <stdio.h>
int main()
{
int decimalNumber;
// 提示用户输入十进制数
printf("请输入一个十进制数: ");
scanf("%d", &decimalNumber);
// 以八进制形式输出
printf("八进制: %o\n", decimalNumber);
// 以十六进制形式输出
printf("十六进制: %x\n", decimalNumber);
return 0;
}
- %o 用于将整数以八进制形式输出。
- %x 输出十六进制数时使用小写字母(a-f)。
- %X 输出十六进制数时使用大写字母(A-F)。