【发布时间】:2022-01-21 18:06:40
【问题描述】:
void Consonanti(char s[],char v[3]) {
int j = 0;
for (int i = 0; (i < strlen(s) && j < 3); i++)
{
if ( (s[i] != 'A') && (s[i] != 'E') && (s[i] != 'I') && (s[i] != 'O') && (s[i] != 'U'))
{
v[j] = s[i];
j++;
}
}
v[3] = '\0';
}
int main () {
char CognomeConsonanti[3], NomeConsonanti[3];
Consonanti(persona.cognome,CognomeConsonanti);
printf("%s ",CognomeConsonanti);
Consonanti(persona.nome,NomeConsonanti);
printf("%s",NomeConsonanti);
return 0;
}
函数 "Consonanti" 应该放入 v[],在第二次调用中是 CognomeConsonanti,然后是 NomeConsonanti,字符串 s[] 的前 3 个辅音。确实如此,如果 printfs 是这样的,它可以正确打印,但是如果我在第二次调用 Consonanti 之后将第一个 printf 放在输出错误并且看起来 CognomeConsonanti 被 Consonanti 的第二次调用修改了,即使我传递了不同的字符串.我不明白为什么,也无法解决。
【问题讨论】:
-
3是一个有趣的数字。 -
您的 strlen(s) 没有按照您认为的那样做,因为您没有正确初始化 persona.cognome?无法确定,因为您的代码不完整。
-
如果一个数组被声明为
char CognomeConsonanti[3]并作为v传递给一个函数,那么v[3] = '\0';正在访问数组的末尾。有效索引为 0 - 2。分配更多空间。