我制作了简单的代码来计算单词中有多少个字母,由于某种原因,变量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。
答案 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