#include <stdio.h>
void word(char a[100], int i, int *max, int *c)
{
printf("%d %d", max , c);
int length = 0;
while (i < strlen(a) && a[i] != ' ')
{
length++;
//printf("%c\n", a[i]);
i++;
}
if (a[i] == ' ' && i < strlen(a))
{
c++;
if (length > max)
max = length;
//printf("%d\n%d", max, c);
word(a, i + 1, max, c);
}
}
void main()
{
char a[100];
int max = 0, j, i = 0, c = 0;
scanf("%[^\n]s", &a);
word(a, 0, &max, &c);
printf("%d\n%d", c, max);
}
GIVEN PROBLEM :给定一个带空格的字符串,编写一个算法和一个C程序来计算其中的字数和最长字的长度。例如,如果输入字符串是'I love programming',那么单词的数量是3,最长字符串的长度是11。
我在递归函数max
中通过引用传递变量c
和word()
时遇到问题。变量未正确传递。我希望递归地通过引用传递变量,以便在每次递归调用时更新它们的值。我是stackoverflow的新手,所以无论我在哪里犯错,请纠正我。
答案 0 :(得分:1)
使用*
表示您传递的是指针,而不是引用(C没有引用)。您应该阅读一些信息页面,例如this really clear one和this,以熟悉两者之间的差异。
做例如。 max = length
然后更改max
指向的地址,而不是更改该地址的值。你的意思是*max = length
,你取消引用指针以获取它指向的地址的值,然后分配给那个值,它会根据你的意愿更新“引用的”变量。鉴于此,printf("%d %d", max , c)
不会打印值 - 您还需要更多*
个。
同样,c++
将指向c
的地址提前一个,它不会增加c
指向的整数(为此,您应该使用{{1} }})。
您应该始终至少使用(*c)++
进行编译,因此编译器会为您提供完整的警告。在这种情况下,您将收到有关无效指针分配的多个警告,包括它们发生的位置,以便您可以更轻松地修复它们。
答案 1 :(得分:1)
我们初学者应该互相帮助。
你在这里。
#include <stdio.h>
#include <string.h>
size_t word( const char *s, size_t *max_word )
{
size_t count = 0;
s = s + strspn( s, " \t" );
if ( *s )
{
++count;
size_t n = strcspn( s, " \t" );
if ( *max_word < n ) *max_word = n;
count += word( s + n, max_word );
}
return count;
}
int main(void)
{
const char *s = "I like programming using C";
size_t max_word = 0;
size_t n = word( s, &max_word );
printf( "Number of words in the string is %zu\n"
"The length of the maximum word is %zu\n ",
n, max_word );
return 0;
}
程序输出
Number of words in the string is 5
The length of the maximum word is 11
至于你的代码,那么对于根据C标准的初学者,没有参数的函数main
应该被声明为
int main( void )
函数声明
void word(char a[100], int i, int *max, int *c);
太复杂了。如果你可以从函数返回一些有用的东西,你应该将它返回。
指定数组大小的第一个参数的声明没有多大意义,因为参数被调整为指针。
由于字符串未在函数中更改,因此应使用限定符const
声明。
第二个参数是冗余的,因为包含字符串的字符数组的标记值等于'\0'
。至少它应该有类型size_t
。
考虑到符号'\t'
也可用作单词分隔符。
初始字符串和任何子字符串都可以以空格开头。但是你的功能忽略了这个事实。
第一个和第二个while循环可以永远执行,在这种情况下,该函数返回一个无效的字数和最大长度值。
此外这句话
c++;
没有意义,因为它增加了指针而不是增加指针指向的值。
本声明
max = length;
也会更改指针本身,而不是更改指针指向的值。