0

我必须做这个练习,我真的很努力,但我不知道如何解决它。

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

请注意,数字也是一个词。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++;
    }
}
4

1 回答 1

1

您的逻辑有缺陷,因为您不会将最后一个“单词”(hi8)算作一个单词。同样,如果“数字”在字符串中,您将不会计算它们。这可以通过一些调试发现。

一种可能的解决方案是使用states。一种状态表明您是否在一个单词中,另一种状态表明当前单词是否全为数字。

使用状态,在遍历字符串时检查当前字符是否为字母数字字符。如果是,并且未设置 is-a-word 状态,则设置该状态。更改状态时,还要检查当前字符是否为数字,如果是则设置 is-number 状态。继续循环,如果设置了 is-a-word 状态,并且当前字符不是数字,则清除 is-number 状态。当到达某个空间时,您检查您的状态:如果设置了 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
    }
}
于 2019-06-14T02:03:46.117 回答