【问题标题】:Function modifies the string from the last call函数修改上次调用的字符串
【发布时间】: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。分配更多空间。

标签: c string function


【解决方案1】:

如果要放置前三个常量,则需要 char v[4] 而不是 char v[3]char CognomeConsonanti[3], NomeConsonanti[3]; 也应该是 char CognomeConsonanti[4], NomeConsonanti[4];v[3] = '\0'; 将踩到 v 的末尾之外。

你必须为\0分配空间。

【讨论】:

    猜你喜欢
    • 2013-12-27
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 2015-02-11
    • 2013-05-11
    • 2021-10-21
    • 2021-06-28
    • 2013-02-06
    相关资源
    最近更新 更多