我有以下功能
int vowels(char *str)
{
int count = 0;
if (! str[0])
return count;
if (strchr("aeiouAEIOU", str[0]))
count ++;
return count + vowels(&str[1]);
}
执行对字符串中出现的所有元音的计数,令我困惑的是递归调用元音(& str [1])不明白为什么每次调用都转到下一个字符,没有这样做 str ++ 。他们可以帮我理解这个吗?请。
答案 0 :(得分:2)
vowels(&str[1])
使用vowels
之后的地址1字节调用&str[0]
,str
是内存中str
的开头。因为char *
是str++
,这意味着它使用字符串减去其第一个字符。
请注意,您不希望&str++
或str
,因为那些会尝试修改 statsG.append(str(diameter_Glob[1]-diameter_Glob[0])+"\t"+str(100*(diameter_Glob[1]-diameter_Glob[0])/diameter_Glob[1])+"\t"+str(pval[1]))
statsG2=np.reshape(statsG,(1,3))
np.savetxt(path+'Stats.txt',statsG2,'%s')
GlobalStats.append(str(start)+"\t"+str(stop)+"\t"+str(statsG2))
np.savetxt('/Volumes/old/RESULTS.txt',GlobalStats, '%s')
本身,而不仅仅是使用部分字符串。
答案 1 :(得分:2)
在每个声明为
的函数调用中int vowels(char *str);
虽然我会声明它像
size_t vowels( const char *str );
表达
&str[1]
相当于
str + 1
或
++str
但是你可能不会使用
str++
因为表达式的值是在增量之前存储在str
中的地址。
至于我,我会按以下方式定义函数
size_t vowels( const char *s )
{
return *s ? ( strchr( "aeiouAEIOU", *s ) != NULL ) + vowels( s + 1 ) : 0;
}
答案 2 :(得分:0)
如果使用str++
获取下一个元素的地址,则没有理由&str[1]
。
答案 3 :(得分:0)
井字符串存储在内存中。这样做是将char的地址传递给函数Num
的char指针。所以str
只是数组的下一个字符的地址(它只是跳转到下一个字节)。