我正在尝试将字符串转换为大写,例如将test.pdf
转换为TEST.PDF
。但是,当我尝试使用printf
打印返回的值时,它将打印一些垃圾值。我究竟做错了什么?
char *covertToUpper(char *str)
{
int i = 0;
int len = 0;
len = strlen(str);
char newstr[len+1];
for(i = 0; str[i]; i++)
{
newstr[i] = toupper(str[i]);
}
//terminate string
newstr[i]= '\0';
return newstr;
}
最佳答案
收到垃圾邮件的原因是因为您在堆栈上分配了newstr
,然后返回其值。这在C语言中是一个很大的禁忌。您随后调用的每个函数(包括printf()
函数本身)都会践踏所有内容您刚刚分配。
不幸的是,C语言有点危险。它不会阻止您将在堆栈上分配的字符串返回给调用函数,即使一旦在函数中声明了该函数,该内存就不再可以安全使用。
与其以这种方式分配字符串,不如使用malloc()
或calloc()
在堆上分配新的内存,并设置newstr
指向它。例如,您可以声明:
char newstr = malloc(len);
当然,当不再使用它时,需要适当地使用
free()
d。关于c - 为什么从函数返回的字符串打印为垃圾?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9441132/