【问题标题】:How exactly getchar() and isblank() works in Cgetchar() 和 isblank() 在 C 中的工作原理
【发布时间】:2020-06-24 08:26:04
【问题描述】:

我目前正在学习 C,今天遇到了这个问题。我被要求设计一个函数,它从一行中读取第一个单词并丢弃其余单词,同时指定要读取的最大字符数。下面是我的!非常感谢你们!

#include<stdio.h>
#include<ctype.h>
void get_vol(char * input, int num);
int main(void)
{
    char input[256];
    int num;
    //char ch;
    printf("How many?\n");
    scanf("%d", &num);
    //while((ch = getchar()) != '\n')
    //    continue;
    get_vol(input, num);
    if (num > 0)
        printf("The word you entered is %s\n", input);
    return 0;
}
void get_vol(char * input, int num)
{
    char ch = 0;
    int i;
    if(num > 0)
    {
        printf("Please enter here:\n");
        do
            ch = getchar();
        while(isblank(ch));
            for(i = 0; !isblank(ch) && i < num; ++i)
            {
                input[i] = ch;
                ch = getchar();
            }
        input[i] = '\0';
    }
    else
        printf("You cannot have less than 1 characters to proceed!\n");
}

所以在这里我遇到了两个问题。 1)似乎我的 get_vol 函数在扫描数字后无法立即删除 '\n' ,除非我故意将这三行留在 cmets 中。所以我猜 getchar() 不能直接跳到下一行,对吧?因为我认为 get_vol() 中的 do...while 循环足以丢弃我的第一个单词之前的任何内容(甚至是新行)。 2)说,我最多有 5 个字符要读取,我输入了三个字符,但是在我的程序中,我需要在输出显示之前再按三次返回键,所以我猜 isblank() 不包括'\n'。我已经在 Xcode 11.5 中验证了这一点。有趣的是,根据C Primer Plus 6th,'\n' 应该包含在 5th 中,'\n' 不在列表中。

【问题讨论】:

  • 我建议你find a simpler problem。这意味着您将复杂的任务分解为更小更简单的子任务。这样做直到每个子任务不能进一步划分。然后一个一个地执行每个小子任务,在进行下一个之前对其进行测试。
  • int ch = 0;,而不是char。它可能看起来好像它也适用于char,但它没有。
  • @AnttiHaapala 嗨,Antti,我明白你的意思了。但是由于我想使用 char 类型来获取字符,所以您建议我如何初始化 ch?
  • 暗示@AnttiHaapala 的问题是getchar 实际上返回int。如果您想将结果与intEOF(您确实应该这样做)进行比较,这一点非常重要。不要担心它是int,C 中的字符几乎总是被提升为int(这就是与EOF 的比较会有问题的原因)。
  • @Someprogrammerdude 不仅如此,如果charisblank 中的扩展字符可能会崩溃

标签: c newline getchar


【解决方案1】:

您遇到的第一个问题是space 字符和blank 字符之间存在差异。

换行符是空格字符,而不是空格。

【讨论】:

  • 嗨,伙计!我不太确定这一点。根据 C Primer Plus 6th,空白字符中包含换行符。我只是无法区分空格和空白,除非空白的范围更大。
  • @Larry1024 来自链接的isblank 参考:“在默认的 C 语言环境中,只有空格 (0x20) 和水平制表符 (0x09) 被归类为空白。”没有换行符。换行符是一个空格(“空白”)字符。
  • @Larry1024(编辑:删除了我关于 isblank 未被 C 标准定义的错误陈述。)
  • @IanAbbott isblank 已添加到 C99 标准中。
  • @Someprogrammerdude 原来如此。 :) 我应该更仔细地阅读 Linux 手册页。
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
相关资源
最近更新 更多