25

好的,我正在阅读这本书:The C Programming Language - Kernighan 和 Ritchie(第二版),其中一个示例我无法理解事物的工作原理。

#include <stdio.h>

#define MAXLINE 1000

int getline(char line[], int maxline);
void copy(char to[], char from[]);

int main(int argc, char *argv[])
{
    int len;

    int max;
    char line[MAXLINE];
    char longest[MAXLINE];

    max = 0;
    while((len = getline(line, MAXLINE)) > 1)
    {
        if(len > max)
        {
            max = len;
            copy(longest, line);
        }
    }
    if(max > 0)
        printf("%s", longest);

    getchar();
    getchar();
    return 0;   
}

int getline(char s[], int lim)
{
    int c, i;

    for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
        s[i] = c;
    if(c == '\n')
    {
        s[i] = c;
        ++i;     
    }
    s[i] = '\0';

    return i;
}

void copy(char to[], char from[])
{
    int i;

    i = 0;
    while((to[i] = from[i]) != '\0')
        ++i;
}

该行:for(i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) 它说c = getchar(),如何从命令行输入整数=字符?整数是的,但是我输入的字符是如何存储的?

提前致谢

4

6 回答 6

35

与您可能使用过的其他一些语言不同,C 中的字符整数。char只是另一种整数类型,通常为 8 位并且小于int,但仍然是整数类型。

因此,您不需要ord()chr()您可能使用过的其他语言中存在的功能。在 C 中,您可以char使用强制转换或仅通过分配在其他整数类型之间进行转换。

除非发生 EOF,否则getchar()定义为返回“转换为 int 的无符号字符”(与 fgetc 相同),因此如果它有帮助,您可以想象它读取了一些字符c,然后返回(int)(unsigned char)c

您可以通过强制转换或分配将其转换回 a unsigned charjust ,如果您愿意稍微损失理论上的可移植性,您可以将其转换为char带有强制转换的 a 或将其分配给 a char

于 2011-08-19T09:28:19.377 回答
11

getchar()函数返回一个整数,表示输入的字符。如果您输入字符A,您将获得'A'0x41返回(升级到 anint并假设您当然在 ASCII 系统上)。

它返回 anint而不是 a的原因char是因为它需要能够存储任何字符以及输入流关闭的 EOF 指示符。

而且,就其价值而言,这对于初学者来说并不是一本真正的好书。从那时起,效率比可读性和可维护性更重要。

虽然它显示了 K&R 之类的人有多聪明,但您可能应该看看更多……对新手友好的东西。

无论如何,它的最后一版涵盖了 C89,并且从那时起发生了很多变化。我们已经通过了 C99,现在有了 C11,而且这本书还没有更新以反映它们中的任何一个,所以它已经过时了。

于 2011-08-19T09:20:49.480 回答
5

Cchar类型是 8 位,这意味着它可以存储从 -128 到 127 或 0 的整数范围(取决于它是否带符号,并且 C 标准不会规定它是什么)到 255(255 个不同的值;这是 ASCII 的范围)。 getchar()return int,这将是至少 16 位(在现代机器上通常是 32 位)。这意味着它可以存储 的范围char以及更多的值。

之所以返回类型是,是因为到达输入流末尾时返回int的特殊值。EOF如果返回类型为char,则无法表示遇到了流的结尾(除非它使用指向记录此条件的变量的指针)。

于 2011-08-19T09:21:58.580 回答
0

现在让我们玩一个逻辑游戏。

Char 也是一种整数类型,其范围比 int 更小,更具体地说是 8 位,即 1 个字节。众所周知,整数类型包括有符号(默认)和无符号。至于char,有符号的范围是-127~128,无符号的范围是0~255。现在我们知道有符号和无符号字符的类型和“能力”了。

我们人类理解字符,而计算机只识别二进制序列。因此各种程序设计语言都必须提供一个模型来处理从字符到二进制序列的转换。ASCII 码是应用于 C 和许多其他编程语言的映射标准。编码 0-9、az 和 AZ 等基本字符以及通常的特殊字符需要 0 - 255。

您可能想知道 unsigned char 是正确的选择。但是,编程应该知道何时停止。最简单的方法是满足特殊值,负值是一个不错的选择,因为更大的正值可能用于其他语言。最后,C 选择了 -1,也就是通常所说的 EOF。

现在我们明白了。带符号的 char 不足以编码 ASCII 字符,而无符号则没有为终止值留下空间。我们需要更大的范围来平衡这一点,也就是 int 类型。萨维?

感谢@cdhowie 的回答,它真的点燃了我。

于 2020-10-30T03:51:17.013 回答
-1

在命令行中输入的每个字符(包括数字)都被读取为一个字符,并且每个字符都有一个基于其 ASCII 代码http://www.asciitable.com/的整数值。

于 2011-08-19T09:23:17.047 回答
-3

回答您的问题。但只需再添加 1 件事。

因为您将变量声明c为 int。很明显,您从0 to 9.ascii 值中获取值48-57。因此,您可以在代码中再添加 1 行 -

c = c-48.

于 2014-06-13T18:26:01.397 回答