我猜将字符串与整数进行比较的问题

Posted

技术标签:

【中文标题】我猜将字符串与整数进行比较的问题【英文标题】: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;

【问题讨论】:

您是否尝试过使用调试器跟踪执行,直到它的行为与您预期的不同? 【参考方案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。

以上是关于我猜将字符串与整数进行比较的问题的主要内容,如果未能解决你的问题,请参考以下文章

如果将字符串与整数进行比较,它会评估为false吗?

MySQL字符串列与整数比较

奇怪的错误,将字符与字符串进行比较(p == "cancel")

如何按原样比较两个两位整数,反转,一次一个字符

Perl 中用于字符和整数的 eq 运算符

bash shell数值比较(-eq)与字符比较(==)的区别