我需要一些帮助,我在某个脸书页面上看到了以下2个代码。
代码1:
/*this is fyn and will print knowledge*/
#include<stdio.h>
void choco(char *s)
{
if(*s=='\0')
return;
printf("%c",*s);
choco(++s);
}
main()
{
choco("knowledge");
}
代码2:
/*even this is fyn bt it wll print egdelon*/
#include<stdio.h>
void choco(char *s)
{
if(*s=='\0')
return;
choco(++s);
printf("%c",*s);
}
main()
{
choco("knowledge");
}
有人可以详细解释两个C代码的输出。我有点困惑。
答案 0 :(得分:2)
choco("knowledge");
都使用指向字符串 knowledge ,'k'的第一个字符的指针调用chocho
函数。以这种方式创建的C-Strings将始终包含尾随字节'0',因此字符串函数确实知道字符串结束的位置。if(*s=='\0') return;
跳过(0字节,见上文)printf("%c",*s);
打印指针s
当前指向的字符。 *s*
用于从指针中检索实际字符。choco(++s);
调用choco,指针s
增加1,因此它指向字符串的下一个字符。 使用此信息,第一个代码示例非常简单。调用函数choco
并打印第一个字符。然后它使指针指向下一个字符('n')并使用更新的指针调用自身。重复此过程,直到到达字符串(0字节)的末尾。
在第二个代码示例中,函数首先使用下一个字符调用自身,并在返回调用时打印字符。因此,首先打印最后一个字符。
考虑来电choco("abc");
:
if(*s=='\0')
,我在第二个代码示例中添加了一些调试输出:
#include <stdio.h>
void choco(char *s){
printf("choco was called with: %c\n", *s);
if(*s=='\0'){
printf("I return\n");
return;
}
choco(s+1);
printf("output: %c\n",*s);
}
int main()
{
choco("knowledge");
}
这是输出的样子:
choco was called with: k
choco was called with: n
choco was called with: o
choco was called with: w
choco was called with: l
choco was called with: e
choco was called with: d
choco was called with: g
choco was called with: e
choco was called with:
I return
output: e
output: g
output: d
output: e
output: l
output: w
output: o
output: n
output: k
答案 1 :(得分:0)
让我们用更短的字符串尝试:
void choco(char *s)
{
if(*s=='\0')
return;
choco(++s);
printf("%c",*s);
}
main()
{
choco("ab");
}
所以print b
并返回步骤1的结果
所以print a
然后完成
**编辑**根据您的评论 让我们试试这里:
choco("ab") :
if('A' = '\0') return;
choco('B') -----------------> if('B'='\0') return;
choco('\0') -----------------> if('\0'='\0') return;
printf(B)
printf(A)