[英]Strange printf output in C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char * reverse(char *string);
int main(int argc, char *argv[])
{
char array[10];
array[0] = 'a';
array[1] = 'b';
array[2] = 'c';
array[3] = 'd';
array[4] = 'e';
printf("1%s\n",array);
char *p = reverse(array);
printf("4%s\n",p);
printf("5%s\n",array);
}
char * reverse(char *string)
{
int size = strlen(string);
char reversed[size];
int i;
int j = 0;
for(i = size-1; i >= 0; i--)
{
reversed[j] = string[i];
j++;
}
printf("2%s\n",reversed);
string = reversed;
printf("3%s\n",string);
return reversed;
}
這段代碼基本上只是初始化一個值數組,然后將其傳遞給反轉這些值的方法。
我不確定這是否是執行任務的最佳方法,因為我是C語言中的指針和數組的新手。
但是真正的問題是這樣的:
任何人都可以找出原因
printf("4%s\n",p);
如果您刪除前面的“ 4”,則看起來像這樣
printf("%s\n",p);
該行根本不會打印?
您要在函數reverse
中返回指向局部變量( reversed
)的指針,實際上該問題應該是: Why did it work in the first place?
。
此代碼string = reversed;
只會復制該指針,再復制該指針的本地副本,因此它不會在函數外部起作用。
要反轉一個字符串,您不需要額外的內存-這可以就地完成。
C中的字符串必須以空字符結尾。 您在非以null終止的字符串上使用strlen。
此外,您只是一個非常幸運的人,因為您的代碼存在嚴重問題:您忘記在字符串的末尾添加\\0
符號。
UPD:主要問題是代碼行char reversed[size];
。 這是一個常規的局部變量,具有自動持續時間,這意味着它在調用函數時就存在,而在函數返回時就消失(請參閱此鏈接) 。
您需要將其更改為:
char *reversed = malloc((size+1)*sizeof(char));
UPD-2:另一個錯誤修復是:
1)添加array[5] = '\\0';
在所有其他數組初始化行之后
2)添加reversed[j] = '\\0';
之后for...loop
:
for(i = size-1; i >= 0; i--)
{
reversed[j] = string[i];
j++;
}
reversed[j] = '\0';
UPD-3:但通常,它將以適當的方式更正確地初始化您的字符串:
char array[10] = "abcde";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.