迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

使用 C 语言中的 getchar 函数

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文将演示关于如何使用 C 语言中的 getchar 函数的多种方法。


在 C 语言中使用 getchar 函数从标准输入流中读取单个字符

getchar 函数是 C 库中标准输入/输出实用程序的一部分。字符输入/输出操作有多个函数,如 fgetcgetcfputcputcharfgetcgetc 的功能基本相当;它们取文件流指针读取一个字符,并将其以 unsigned char 的形式转换为 int 类型返回。

请注意,getchargetc 的特殊情况,它隐含地传递了 stdin 文件流作为参数来读取字符。因此,getchar 不需要任何参数,并将读取的字符转换为 int 类型返回。在下面的例子中,我们演示了用 putchar 函数输入一个字符并打印的基本情况。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int ch;

    printf("Please, input a single character: ");
    ch = getchar();
    putchar(ch);

    exit(EXIT_SUCCESS);
}

在 C 语言中使用 getchar 函数读取字符串输入

或者,我们可以实现一个循环来读取输入的字符串,直到遇到新的行或 EOF,并将其存储在一个预先分配的 char 缓冲区。不过要注意,与调用 getsgetline 相比,这种方法会增加性能开销,而 getsgetline 是实现同样功能的库函数。解决方案的主要部分是一个 while 循环,执行到 getchar 函数返回的值不等于新的行字符或 EOF

在这种情况下,我们任意分配一个大小为 20 个字符的 char 数组。每一次迭代,都会实现数组中第一个元素的指针,并将 getchar 的返回值分配给它。最后,我们用 printf 函数调用输出缓冲区。

#include <stdio.h>
#include <stdlib.h>

enum { SIZE = 20 };

int main(void)
{
    char buf[SIZE];
    char *p;
    int ch;

    p = buf;
    printf("Please, provide input: ");
    while ((ch = getchar()) != '\n' && ch != EOF) {
        *p++ = (char)ch;
    }
    *p++ = 0;
    if (ch == EOF) {
        printf("EOF encountered\n");
    }

    printf("%s\n", buf);

    exit(EXIT_SUCCESS);
}

输出:

Please, provide input: string longer than 20 characters
string longer than 20 characters

尽管前面的例子代码通常都能正常工作,但它有几个错误,可能导致缓冲区溢出错误或程序异常终止。由于我们处理用户输入的内容直到遇到新的行或 EOF,所以不能保证它能装进固定大小的 char 缓冲区。如果我们必须使用固定缓冲区,我们要负责统计输入的大小,并在达到容量后停止在缓冲区中存储。

在前面的代码中我们解决了这个问题后,我们要处理使用%s 指定符打印缓冲区内容的 printf 语句。需要注意的是,并不能保证输入字符串的最后一个字符是空字节,所以如果用户自己没有在缓冲区的最后插入空字节,printf 调用就不知道停在哪里。下面的示例代码纠正了之前的错误,并增加了一些行数,以便更好的演示。

#include <stdio.h>
#include <stdlib.h>

enum { SIZE = 20 };

int main(void)
{
    char buf[SIZE];
    int ch;
    size_t index = 0;
    size_t chars_read = 0;

    printf("Please, provide input: ");
    while ((ch = getchar()) != '\n' && ch != EOF) {
        if (index < sizeof(buf) - 1) {
            buf[index++] = (char)ch;
        }
        chars_read++;
    }
    buf[index] = '\0';
    if (ch == EOF) {
        printf("EOF encountered\n");
    }
    if (chars_read > index) {
        printf("Truncation occured!\n");
    }

    printf("%s\n", buf);

    exit(EXIT_SUCCESS);
}

输出:

Please, provide input: string longer than 20 characters
Truncation occured!
string longer than

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 C 语言中使用 typedef enum

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文介绍了如何在 C 语言中使用 typedef enum。使用 enum 在 C 语言中定义命名整数常量 enum 关键字定义了一种叫做枚举的特殊类型。

C 语言中的静态变量

发布时间:2023/05/07 浏览次数:151 分类:C语言

本文介绍了如何在 C 语言中使用静态变量。在 C 语言中使用 static 变量在函数调用之间保存变量值

C 语言中生成随机数

发布时间:2023/05/07 浏览次数:64 分类:C语言

本文演示了如何在 C 语言中生成随机数。使用 rand 和 srand 函数在 C 语言中生成随机数

C 语言中的 i++ 与++i

发布时间:2023/05/07 浏览次数:83 分类:C语言

本文演示了如何在 C 语言中使用前缀增量与后缀增量运算符。C 语言中++i 和 i++ 记号的主要区别

C 语言中获取当前工作目录

发布时间:2023/05/07 浏览次数:182 分类:C语言

本文演示了如何在 C 语言中获取当前工作目录。使用 getcwd 函数获取当前工作目录的方法

C 语言中的位掩码

发布时间:2023/05/07 浏览次数:126 分类:C语言

本文介绍了如何在 C 语言中使用位掩码。使用 struct 关键字在 C 语言中定义位掩码数据

C 语言中的排序函数

发布时间:2023/05/07 浏览次数:181 分类:C语言

本文演示了如何在 C 语言中使用标准库排序函数。使用 qsort 函数对 C 语言中的整数数组进行排序

C 语言中的 extern 关键字

发布时间:2023/05/07 浏览次数:114 分类:C语言

本文介绍了如何在 C 语言中使用 extern 关键字。C 语言中使用 extern 关键字来声明一个在其他文件中定义的变量

C 语言中的 #ifndef

发布时间:2023/05/07 浏览次数:186 分类:C语言

本文介绍了如何在 C 语言中使用 ifndef。在 C 语言中使用 ifndef 保护头文件不被多次包含 C 语言中的头文件用于定义同名源文件中实现的函数的接口。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便