当我编译这个程序时,我只得到第一个大写字母而不是其他大写字母。
ABldjfdslkjfCK
我只能得到'A'吗?
#include <stdio.h>
#include <string.h>
FILE *fp;
int main(void)
{
int size;
char input[100]; // array size of 100
if (fp = fopen("message.txt","r")) // file exists
{
fgets(input,100,fp);// scans the sentence.
}
else
{
printf("file not found");// if there is no such a file.
}
size=strlen(input);
recursive(size,input);
return 0;
}
int recursive(int size, char array[])
{
static int index = 0; // static so when the function is called, the value is kept
if (index < size) // start from index 0 until the size-1
{
if (array[index] >= 'A' && array[index] <= 'Z') // check for A to Z (CAPITALIZE CHARACTERS only)
{
printf("%c\n", array[index]); // print it
}
else
{
return recursive(size,array); // calls the function (recursion)
}
}
return 0;
}
答案 0 :(得分:14)
您永远不会增加index
的值。此外,如果当前字符是大写字母,则不调用函数recursive
,因此函数只返回。
不是为index
使用静态变量,最好将其作为参数传递给recursive
;否则,该函数是不可重入的。
答案 1 :(得分:4)
只有在找到非大写字符时,您的递归函数才会调用自身。当它找到第一个大写字母时,它会打印它并退出
答案 2 :(得分:3)
您当前的函数仅打印A
,因为只要它找到一个大写字母(在您的情况下为A
),它就会返回0.
还有其他问题,所以我会改写这样的函数:
#include <ctype.h> /* for isupper */
void recursive(const char* s)
{
/* stop condition: empty string */
if (s[0] == '\0')
return;
/* main body: print letter if capital */
if (isupper(s[0]))
printf("%c\n", s[0]);
/* recursion: advance to the next character */
recursive(s + 1);
}
像这样使用:recursive(input)
。
答案 3 :(得分:3)
您的递归函数存在的其他问题是index
变量是静态的。这在当前版本中不是问题,因为除了琐碎的方式之外你实际上并没有使用它。但是,一旦您尝试修复其他问题(这可能会导致您以更复杂的方式使用index
),拥有static
会产生一些问题:
答案 4 :(得分:2)
两个问题:
答案 5 :(得分:1)
我看到的第一个错误是你永远不会增加索引。