好的 - 所以我正在学习C--专门针对这个问题指针和功能。
我有这个功能
char *RemoveVowels(char *str) {
char outStr[40];
for (size_t i = 0; i < sizeof(outStr); i++)
outStr[i] = '\0';
char *c = outStr;
while (*str) {
switch (*str)
{
case 'A':case'a':
case 'E':case'e':
case 'I':case'i':
case 'O':case'o':
case 'U':case'u':
*str++;
break;
default:
*c++ = *str++;
break;
}
}
*c = '\0';
return outStr;
}
我只是试图了解指针如何与数组一起使用以及它们如何用于返回字符串。
当我用
调用此函数时puts(RemoveVowels("some string with vowels in it"));
这个功能有效,我不关心更好的方法,我确定有,它是我感兴趣的指针/数组/字符串操作。
我可以看到字符串创建了一个新字符串并删除了outStr中的元音。但是我只是从puts()中获取乱码,为什么不打印字符串,我确保它以NULL结束?
温柔我学习:)。
答案 0 :(得分:1)
您返回本地变量outStr
的地址
仅这一点就是改变的原因,其原因被称为未定义的行为,应该响起所有的警钟
这是一个猜测,其中鼻子正好飞来飞去。这不是对你案件中发生的事情的解释,只是一个让你害怕的想法。
在一个函数(RemoveVowels()
)中返回局部变量的地址后,再调用另一个函数(puts()
),该函数肯定有自己的局部变量。
你必须假设该函数的局部变量是在与前一个函数的局部变量相同的位置创建的,即每次被杀死和覆盖。
因此,无论第一个函数在其现有的不存在的局部变量中做了什么都会丢失
没有什么可以期待的。