我必须做这个练习,我确实在尽力而为,但是我不知道该怎么解决。
它说我需要编写一个程序来分析字符串。并且需要给出单词和数字的数量。
请注意,数字也是单词。 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++;
}
}
答案 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
}
}