一開始在練習這個範例的時候我是這樣寫的:
/******************** reverse function exercise has two error*****************/
#include <stdio.h>
#include <string.h>
int reverse(char *str)
{
int i,j;
char reg;
j = strlen(str);
for(i=0; i<j; i++)
{
reg = str[i];
str[i] =str[j];
str[j] = reg;
j--;
}
return 0;
}
int main()
{
char *m_str = "12345";
reverse(m_str);
printf("After reversing m_str=%s\n", m_str);
return 0;
}
/**********************************************************/
上面的程式,編譯過程很順利,但是執行起來卻有兩個嚴重的錯誤,先賣個關子,各位看倌有看出來嗎?
首先第一個錯誤======> 執行後會看到錯誤訊息 "Segmentation fault",發生原因在於main裡面的 char *m_str= "12345"宣告,這樣的宣告方式只宣告了指標,但是並沒有實體位置,因此會有這個錯誤訊息。
上面問題解決之後,編譯完成後再執行一次執行檔,輸出結果如下:
After reversing m_str=
m_str的值竟然會是空的! 這是第二個錯誤的地方。
而發生的原因是因為reverse() 這隻function裡面,在計算str的長度時忘了減1。解釋如下:
原始的str內容===> str[0]='1', str[1]='2', str[2]='3', str[3]='4', str[4]='5' 另外還有一個結尾字元 str[5]='/0'
因此在字元陣列交換時誤把str[5]的'/0'交換到了str[0],因此printf出來才會是空的值。
把這兩個問題修改過後,就沒有問題了,正確的程式碼如下:
/********************reverse function exercise*************************************/
#include <stdio.h>
#include <string.h>
int reverse(char *str)
{
int i,j;
char reg;
j = strlen(str)-1;
for(i=0; i<j; i++)
{
reg = str[i];
str[i] =str[j];
str[j] = reg;
j--;
}
return 0;
}
int main()
{
char m_str[] = "12345";
reverse(m_str);
printf("After reversing m_str=%s\n", m_str);
return 0;
}
/**********************************************************/
沒有留言:
張貼留言