C代码计算一个单词中的字母数

时间:2017-10-16 09:29:23

标签: c string function loops

我制作了简单的代码来计算单词中有多少个字母,由于某种原因,变量letters不一致,这里是代码

#include <stdio.h>

int main()
{
    char str;
    int slen(char *str)
    {
        int i;
        int letters=0;
        for(i=0;i<30;i++)
        {
            if((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z'))
                letters++;
        }
        return letters;
    }
    printf("%d \n", slen("Word"));
}

变量letter在这里打印22。

4 个答案:

答案 0 :(得分:3)

由于< 30循环中的for条件,您的程序会越过"Word"字符串边界并开始计算该字符串后面的内存中的任何内容。

< 30替换为< strlen(str)(您需要#include <string.h>)。

更新 :(感谢@J ... S(见注释))或者你可以改写

for (i=0; i < 30; i++)
{
    if((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z'))
        letters++;
}

while (str != '\0') {
    if ((*str >= 'A' && *str <= 'Z') || (*str >= 'a' && *str <= 'z')) {
        letters++;
    }
    ++str;
}

您还可以使用isalpha()之类的内容,而不是if条件。

顺便说一下,使用空格来分隔一行的不同部分。否则它真的很难读。谢谢:))

答案 1 :(得分:1)

该函数应在main()之外声明/定义。

改变这个:

for(i=0;i<30;i++)

到此:

for(i = 0; i < strlen(str); i++)

因为你想迭代字符串的长度,而不是多于或少于它的实际长度。

在你的情况下,&#34; Word&#34;只有4个字母,你迭代直到i < 30评估为假,调用未定义的行为,因为你将访问超出范围的内存。

把所有东西放在一起,我们得到:

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

int slen(char *str)
{
    int letters=0;
    for(unsigned int i=0;i<strlen(str);i++)
    {
        if((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z'))
        letters++;
    }
    return letters;
}

int main()
{ 
    printf("%d \n", slen("Word"));
}

输出:

  

4

答案 2 :(得分:0)

你想要这个:

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


// declaring slen outside main (not using non standard GNU extension)

int slen(char *str) 
{
  int i;
  int letters = 0;
  int length = strlen(str);  // using strlen, in order not to go beyond the end
                             // of the string


  for (i = 0; i < length; i++) {
    if ((str[i] >= 'A' && str[i] <= 'Z') || (str[i] >= 'a' && str[i] <= 'z'))
      letters++;
  }

  return letters;
}

int main()
{
   printf("%d \n", slen("Word123"));
}

此处的预期输出为4(4个字的“Word”,不包括数字1,2和3)。

Slighly优化版本:

int slen(char *str) 
{
  int letters = 0;

  for (int i = 0; ; i++) {
    char c = str[i];
    if (c == 0)
      break;

    if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
      letters++;
  }

  return letters;
}

甚至更好地使用isalpha中的ctype.h

#include <ctype.h>
...
int slen(char *str) 
{
  int letters = 0;
  for (int i = 0; ; i++) {
    int c = str[i];    // yes, int is correct, isalpha wants an int    
    if (c == 0)
      break;

    if (isalpha(c))
      letters++;
  }

  return letters;
}

答案 3 :(得分:0)

对于根据C标准的初学者,不带参数的函数main应声明为

int main( void )

虽然根据C标准,一些编译器可以再次拥有自己的语言扩展,但您可能无法在另一个函数中定义函数。

还要考虑到拉丁字母在给定字符集中不必按顺序相互跟随。例如,在EBCDIC集中,一些字母不会相继顺序。字母之间嵌入了其他符号。

因此最好使用标题isalpha中声明的标准C函数<ctype.h>

此功能中也未更改原始字符串。所以它应该用限定符const声明。

目前还不清楚为什么在函数

中的这个循环中使用了这个幻数30
for(i=0;i<30;i++)

考虑到所有这些,程序看起来像

#include <stdio.h>
#include <ctype.h>

size_t letters_count( const char *s )
{
    size_t count = 0;

    for ( ; *s; ++s )
    {
        if ( isalpha( ( unsigned char )*s ) ) ++count;
    }

    return count;
}

#define N   100

int main(void) 
{
    char s[N];

    printf( "Enter a statement: " );

    fgets( s, sizeof( s ), stdin );

    printf( "The statement contains %zu letters\n", letters_count( s ) );

    return 0;
}

它的输出可能看起来像

Enter a statement: Hello TheErolley
The statement contains 15 letters