【问题标题】:Trying to make a loop which counts letters but not spaces试图制作一个计算字母但不计算空格的循环
【发布时间】:2020-12-05 12:14:06
【问题描述】:

我正在尝试构建一个简单的程序来计算用户输入中的字母数量。我的想法是使用for 循环,该循环将为字符串中的每个字母循环,增加一个计数器,并在最后返回最终的计数器总数。但是,我不希望程序计算空格——我试图使用isalpha 函数来执行此操作——但我似乎格式不正确。此外,我尝试使计数器不为空格增加的方式是使用c = c,但是,这似乎也是不正确的。这是我目前写的代码:

int c = 0;

int main(void)
{
    string s = get_string("Input:  ");
    printf("Output: ");
    for (int i = 0; i < strlen(s); i++)
    {
    if( s[i] (isalpha))
        {
        c++;
        }
    else
        {
        c = c;
        }
    }
    printf("%i\n", c);
}

【问题讨论】:

  • 提问时,请添加minimal reproducible example。这意味着您应该包含重现问题的完整源代码。您的代码使用string,它不是标准的 C 标识符。很可能,您正在学习哈佛的 CS50 课程,而您的实际文本包含类似 #include "cs50.h" 的行。您应该在问题中提供的源代码中显示这一点。
  • 永远不要将问题描述为“但我的格式似乎不正确”。说明您观察到的错误消息或不良行为。说明你想要什么行为。说明你做了什么会导致不良行为。那可能是“我编译了这里显示的源代码,结果是编译器打印了一条消息“xyz”,但我希望程序编译没有错误。”
  • @EricPostpischil 感谢您的建议,今后我将确保遵循这些准则。

标签: c increment isalpha


【解决方案1】:

isalpha 实际上是一个函数调用。 (它是一个函数调用或类似函数的宏。)根据传递零个、一个或多个参数,函数调用写为name()name(argument)name(argument,…)isalpha 接受一个参数。该参数应该是一个unsigned char 值。所以你可以称它为isalpha((unsigned char) s[i])。您的 if 声明应如下所示:

if (isalpha((unsigned char) s[i]))

您的程序还应包含 #include &lt;ctype.h&gt; 以包含声明 isalpha 的标头。

【讨论】:

  • 非常感谢,您知道我需要做什么才能使计数器不增加空格吗?
  • @BlueKhakis:你不需要做任何事情来让计数器不增加。 else 部分的大括号可以为空,如 else { },或者您可以完全省略 else 部分。同样,我们不知道您对此有什么问题,因为您没有说它“似乎不正确”。我们不知道这是否意味着您收到了来自编译器的错误消息,或者是哪条消息,或者程序是否没有按照您想要的方式运行,或者是否存在其他问题。
  • 好的,谢谢,以后的问题我会更用心描述的。
【解决方案2】:

这条记录

s[i] (isalpha)

不正确,没有意义。

您需要的是以下内容

size_t c = 0;

for ( size_t i = 0; s[i] != '\0'; i++ )
{
    if( isalpha( ( unsigned char )s[i] ) ) ++c;
}
printf("c = %zu\n", c );

注意函数 isalpha 声明在您必须包含的标头 &lt;ctype.h&gt; 中。

【讨论】:

  • 嗨弗拉德,您能解释一下您发布的代码中的“size_t”在做什么吗?
  • @BlueKhakis:size_t 是一种无符号整数类型,通常用于表示数组索引。
猜你喜欢
  • 2019-08-14
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多