如何计算字符串的数字和字符?

时间:2019-06-14 01:22:32

标签: c

我必须做这个练习,我确实在尽力而为,但是我不知道该怎么解决。

它说我需要编写一个程序来分析字符串。并且需要给出单词和数字的数量。

请注意,数字也是单词。 123是一个单词和一个数字,但是例如4HIMATE不是一个数字,只有一个单词。

我会让我到​​目前为止的代码

int main()

{
int size= 256;

char s[256]= "Hi 123 Peter 8hi hi8";
char space[]= " ";


int wordCount= 0;
int numberCount= 0;

strcat(s, space);

strlwr(s);

for(int i= 0; s[i]!='\0'; i++)
{
    if(s[i+1]== ' ' && s[i]>96 && s[i]<123)
    {
        wordCount++;
    }

    if(s[i+1]== ' ' && s[i]>47 && s[i]<58)
    {
        wordCount++;
    }

}

for (int j=0; j<size; j++)
{

    if(s[j+1]== ' ' && s[j]>47 && s[j]<58)
    {
        numberCount++;
    }
}

printf("Words= %d\n", wordCount);
printf("Numbers= %d", numberCount);

return 0;
}

我的输出必须是=

单词= 5 数字= 1

但是错误在于数字,输出为2。

我真的不知道该怎么解决,所以我需要一些帮助。

更正了一些错误(编辑):

 for(int i= 0; s[i]!='\0'; i++)
{
    if(s[i+1]== ' ' && s[i]>'a' && s[i]<'z')
    {
        wordCount++;
    }

    if(s[i+1]== ' ' && s[i]>'0' && s[i]<'9')
    {
        wordCount++;
    }

}

for (int j=0; s[j]!='\0'; j++)
{

    if(s[j+1]== ' ' && s[j]>'0' && s[j]<'9')
    {
        numberCount++;
    }
}

1 个答案:

答案 0 :(得分:1)

您的逻辑有缺陷,因为您不会将最后一个“单词”(hi8)视为单词。同样,如果数字在字符串的最后,您就不会计算在内。可以通过一些debugging来找到。

一种可能的解决方案是使用状态。一种状态告诉您是否输入单词,另一种状态告诉您当前单词是否为全数字。

使用状态时,遍历字符串时,请检查当前字符is an alpha-numeric character是否有效。如果是,并且未设置is-a-word状态,则设置该状态。更改状态时,还请检查当前字符is a digit是否已设置,是否设置了is-number状态。继续循环,如果设置了is-a-word状态,并且当前字符是 not 数字,则清除is-number状态。当到达is a space时,您需要检查状态:如果设置了is-a-word,则清除它并增加单词计数器;如果设置了is-number状态,则增加数字计数器并清除状态。

代码中,可能是这样的:

is-a-word-state = false
is-a-number-state = false

for each character in string
{
    if (current-character is alphanumeric and is-a-word-state == false)
    {
        // Started a new word
        is-a-word-state = true

        if (current-character is digit)
        {
            // Could be a number
            is-a-number-state = true
        }
    }

    if (current-character is not digit)
    {
        // Current word (if any) is not a number
        is-a-number-state = false
    }

    if (current-character is space)
    {
        if (is-a-word-state == true)
        {
            // End of the current word
            word-counter++

            if (is-a-number-state == true)
            {
                // Word is a number
                number-counter++
            }
        }

        is-a-word-state = false
        is-a-number-state = false
    }
}