查看單個文章
舊 2011-07-24, 11:05 AM   #3 (permalink)
getter
管理員
 
getter 的頭像
榮譽勳章
UID - 6433
在線等級: 級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時級別:96 | 在線時長:9733小時 | 升級還需:64小時
註冊日期: 2002-12-08
住址: 天線星球
文章: 8157
精華: 0
現金: 19955 金幣
資產: 765391 金幣
預設

您的原始碼,迪西看不太懂,且迪西爛爛的 DEV-C 無法編譯
重新整理排版過您的原始碼之後 ...

語法:
#include <stdio.h>  
#include <stdlib.h> 

int my_strlen(char *a);
int main(void)
{
 char a[100],b[100];
 int i,j,l;

 printf("\n請輸入字串 :");
 gets(a);
 l = my_strlen(a); //判斷字串長度 

 printf("\n字串長=%d\n",l);
 
 i=0; 
 while (l >= 0) 
       b[l--] = a[i++];
	
 for (j=0;j<=my_strlen(a);j++)
     printf("%c",b[j]);

 printf("\n\n");
 system("pause");
 return 0;
}


int my_strlen(char *a)
{
 int i=0;
 while (i>=0)
    {
     if(a[i]=='\0') break;
     else i++;
    }
 i++;
 return i;
}

發現幾個怪怪的地方

1.
語法:
 i=0; 
 while (l >= 0) 
       b[l--] = a[i++];
這個應該是使用 array 的顛倒複製方式吧 ...,有一個詭異的錯誤
就是會把 "\0" 給複製到前面去,當用 printf ("%s") 的標準化格
式顯示時,就會顯示不出來 ...,這是很明顯的邏輯錯誤,程式碼
乍看之下是對的但,實際運作是錯得,因此後面不得已只好用字元
列印的方式印出來

語法:
 for (j=0;j<=my_strlen(a);j++)
      printf("%c",b[j]);

因此正確的作法式,在測量字串的長度時,要把 "\0" 字串結尾要排除
計算 ...

語法:
int my_strlen(char *a)
{
 int i=0;
 while (i>=0)
    {
     if(a[i]=='\0') break;
     else i++;
    }
 //i++; 據迪西的推測,這一行是補"\0" 字串結尾,拿掉即可 
 return i; 
}

簡單的說就是,當程式在處理字串的內容時 "\0" 的字串結尾要先排除
最後補在字串的最後面表示字串的結束。

2.
Function 的宣告,若是要把 Function 程式碼,放到 main 後面
則一定要這樣宣告,而不是 int my_strlen(); ,連同那個 () 裡面
的也要有 int my_strlen(char *a); ,不然某些編輯器容易出錯...
,正確如下:

Function a (XXX);

main()
{ ------ }

Function a (XXX)
{ ------ }

或是
Function a (XXX)
{ ------ }

main()
{ ------ }


3.
那個抓字串長度的方式,寫得很好,不過依據正確的說法多算了 "/0"
的字元結尾,所以錯了,可以用 strlen 字串長度的量測指令,該指令在
string.h 中,需要 #include <string.h>


第一次修改的如下:
語法:
#include <stdio.h>  
#include <stdlib.h> 

int my_strlen(char *a);
int main(void)
{
 char a[100],b[100];
 int i,j,l;

 printf("\n請輸入字串 :");
 gets(a);
 l = my_strlen(a); //判斷字串長度 
 
 printf("\n字串長 : %d\n",l);

 i=0; 
 l-=1; //C & C++ 語言的 array 是從 0 開始,如長度 6 則須 -1,因為 0~5  
 while (l >= 0) //array 的反向複製 
     b[l--] = a[i++]; //與 b[i++] = a[l--]; 相同 
      
 b[i]='\0';	// 補上字串的結尾 
 
 //for (j=0;j<=my_strlen(a);j++) 因為修正成標轉化的格式後,可以省略 
 //     printf("%c",b[j]);            因為修正成標轉化的格式後,可以省略 
 
 printf("交換前 : %s \n",a);
 printf("交換後 : %s \n\n",b);
 system("pause");
 return 0;
}


int my_strlen(char *a)
{
 int i=0;
 while (i>=0)
    {
     if(a[i]=='\0') break;
     else i++;
    }
 //i++; 據迪西的推測,這一行是補"\0" 字串結尾,拿掉即可 
 return i;
}


第二次使用 strlen 函數式的修改的如下:
語法:
#include <stdio.h>  
#include <stdlib.h> 
#include <string.h>  

int main(void)
{
 char a[100],b[100];
 int i,j,l;

 printf("\n請輸入字串 :");
 gets(a);
 l = strlen(a); //判斷字串長度 
 
 printf("\n字串長 : %d\n",l);

 i=0; 
 l-=1; //C & C++ 語言的 array 是從 0 開始,如長度 6 則須 -1,因為 0~5 
 while (l >= 0) //array 的反向複製 
     b[l--] = a[i++]; //與 b[i++] = a[l--]; 相同 
      
 b[i]='\0';	// 補上字串的結尾  
 
 printf("交換前 : %s \n",a);
 printf("交換後 : %s \n\n",b);
 system("pause");
 return 0;
}

此帖於 2011-07-24 11:31 AM 被 getter 編輯.
__________________
在「專業主討論區」中的問題解決後,要記得按一下 http://forum.slime.com.tw/images/stamps/is_solved.gif 按鈕喔,
這是一種禮貌動作。

一樣是在「專業主討論區」中發問,不管問題解決與否,都要回應別人的回答文喔。
不然搞 [斷頭文],只看不回應,下次被別人列入黑名單就不要怪人喔。

天線寶寶說再見啦~ ... 天線寶寶說再見啦~

迪西:「再見~ 再見~」

Otaku Culture Party 關心您 ...
getter 目前離線  
送花文章: 37855, 收花文章: 6441 篇, 收花: 26052 次
回覆時引用此帖
有 2 位會員向 getter 送花:
a471 (2011-07-26),bobo0836 (2011-07-25)
感謝您發表一篇好文章