【C语言】结束符“\0“与输入输出函数

1 结束符"\0"与输入输出函数

1.1 结束符"\0"

在 C 语言中,字符串并不是一个单独的数据类型,而是一个字符数组。字符串的结束是通过一个特殊的字符来标识的,这个字符就是"\0"(null 字符)。

例如,字符串 "hello" 在内存中实际上是存储为 {'h', 'e', 'l', 'l', 'o', '\0'}。

  1. 标识字符串结束:'\0' 告诉程序字符串的结束位置。没有这个结束符,程序在处理字符串时将无法确定何时停止读取字符,可能会导致读取未定义的内存区域。
  2. 字符串函数:许多 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)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值