c - C 程序将标准输出的小写字母转换为大写字母的小问题

标签 c linux char buffer std

我正在学习 linux 中的系统调用,我编写了一个快速程序来将 stdin 复制到 stdout。

我想在写入标准输入之前将小写字母转换为大写字母。

我用一个指向数组的指针实现了一个函数来将字符大写。它只大写了 write 的第一个字母,我不明白为什么。据我了解,由于 read() 系统调用,我不需要 for 循环。

#include <unistd.h>
#define SIZE 512
char charToUpper(char *);

int main () {
    int nread;
    char buf[SIZE];
    while (nread = read(0, buf , SIZE)) {
        charToUpper(buf);
        write(1,buf,nread);
    }
    return 0;
}

char charToUpper(char *a){
    if ((*a > 96) && (*a <123)) {
        *a = *a-32;
        return *a;
    }
}

最佳答案

您的 charToUpper 接收到一个指向 char 的指针,并且您向它发送了 buf,它衰减为一个指向 char 的指针buf 中第一个字符的 ,因此是您的结果。

请记住,在 c 中,您无法免费获得要传递的数组的大小 - 您还必须传递它。考虑您在 charToUpper 中的所有操作都在 *a 上,它是 char 类型,一个字符。因此,要解决此问题,请将声明更改为

char charToUpper(char *, unsigned int size);

所以知道你知道你实际阅读了多少字符并且需要更改。现在尝试更改您的程序以适应这种情况。一个提示 - 例如,您的 return 可能需要移动。

关于c - C 程序将标准输出的小写字母转换为大写字母的小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58229621/

相关文章:

c++ - 如何使用 C++ : When STDIN is NOT redirected 通过标准输入获取可用数据的大小

c - 传递给方法后结构体值发生变化

linux - linux系统上的/proc/self/fd/socket文件是什么意思以及如何找到端口

linux - C++11线程库是否调用OS API来运行多线程程序?

在 C 中正确地将 const void 指针转换为 const char 指针数组

php - PHP 中的非 ASCII 字符?

c - Typedef 结构定义,将指向所述结构的指针作为其元素

使用基于花括号的语法读取配置文件的 C 库

c++ - 如何 Hook 时间功能

c - 使用 memcpy 和 strtoul 获取乱码而不是数字