【问题标题】:problem in comparing string to a integer i guess我猜将字符串与整数进行比较的问题
【发布时间】:2021-12-27 19:35:18
【问题描述】:

此代码不起作用,数字 0 到 9 在给定字符串中重复了多少次。

这是问题,来自hackerrank:

给定一个由字母和数字组成的字符串 S,求给定字符串中每个数字出现的频率。

我在我的逻辑中找不到任何错误。

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

int main()
{
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */
    char s[1000];
    int count[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    char temp;
    scanf("%s", s);

    for (int i = 0; i < 10; i++)
    {
        temp = i;

        for (int j = 0; j < strlen(s); j++)
        {
            if (s[j] == i)
            {
                count[i] = count[i] + 1;
                continue;
            }
            else
            {
                continue;
            }
        }
    }

    for (int k = 0; k < 10; k++)
    {
        printf("%d ", count[k]);
    }

    return 0;
}

【问题讨论】:

  • 您是否尝试过使用调试器跟踪执行,直到它的行为与您预期的不同?

标签: c for-loop if-statement c-strings digits


【解决方案1】:

至少你需要写

if (s[j] == i + '0')

否则,您将尝试将具有 ASCII 码 48 的字符 '0' 与整数 0 进行比较。

但无论如何,for 循环都是低效的。

最好写:

for (const char *p = s; *p; ++p)
{
    if ('0' <= *p && *p <= '9') ++count[*p - '0'];
}

【讨论】:

  • 为什么效率低?我对此知之甚少。我还在学习。
  • @TusharKamboj 至少因为同一个字符串被解析了 10 次。
【解决方案2】:

您正在将一个字符与一个整数进行比较。现在,char 是数字类型,所以你可以这样做,但结果不是你所期望的。例如,ASCII 中的字符'0'48

您可以将 01 或任何其他单个数字转换为其 ASCII 表示,方法是将其添加到 '0'

【讨论】:

    【解决方案3】:

    if (s[j] == i) => 这里s 定义为字符,i 定义为整数。因此,要解决此问题,您必须将整数转换为字符。 sprintf() 可以工作或简单的 +'0'。

    【讨论】:

    • 其实s是一个char数组。 s[j]char
    • char 可以毫无问题地与int 进行比较(即使int 的值大于char 可以容纳的值)。比较 intchar 本质上没有错,只要您考虑到 ASCII 字符具有可能与您预期不同的特定整数值。
    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多