2015年3月10日 星期二

字串反轉-範例練習(錯誤發掘&修正)

一開始在練習這個範例的時候我是這樣寫的:


/******************** 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;
}

/**********************************************************/

沒有留言:

張貼留言