史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   程式語言討論區 (http://forum.slime.com.tw/f76.html)
-   -   C語言,倒轉字串,有沒有更好的寫法? (http://forum.slime.com.tw/thread266355.html)

bobo0836 2011-07-24 04:45 AM

C語言,倒轉字串,有沒有更好的寫法?
 
題目是,由鍵盤輸入一個字串,將字串以前後顛倒的順序印出來,舉例來說,輸入的字串為"Hello",輸出即為"olleH"以下是小弟打的程式碼,請問有沒有更好的寫法?煩請賜教!謝謝!!!

語法:

#include <stdio.h>
#include <stdlib.h>
int my_strlen();
int main (void)
{
        char a[100];
        char b[100];
    int i=0;
        int j;
        int l;
        gets(a);
        l = my_strlen(a);
        printf("字串長=%d\n",l);
        while (l >= 0)
                b[l--] = a[i++];
        for(j=0;j<=my_strlen(a);j++)
        {
                printf("%c",b[j]);
        }
        printf("\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;
}


getter 2011-07-24 10:05 AM

問題點主要是在交換的方法,如頭尾交換法,泡沫交換法之類

泡沫交換法
語法:

int main(int argc, char *argv[])
{
 char text[100]="";
 int tlen,i,j;
 
 clrscr();
 printf("\n泡沫交換法\n\n");
 printf("\n請輸入一串的英數文字: ");
 gets(text);
 
 printf("\n字串長度 : %d \n",strlen(text));
 printf("交換前 : %s \n",text);
 
 //字串顛倒 : 泡沫交換法
 tlen=strlen(text);
for (i=0;i<tlen-1;i++)
  for (j=0;j<tlen-1-i;j++)
      text[j]^=text[j+1]^=text[j]^=text[j+1];
               
 
 printf("交換後 : %s \n\n",text);

 pause();
 return 0;
}

http://img819.imageshack.us/img819/7121/swap2.png



頭尾交換法
語法:

int main(int argc, char *argv[])
{
 char text[100]="";
 int tlen,i;
 
 clrscr();
 printf("\n頭尾交換法\n\n");
 printf("\n請輸入一串的英數文字: ");
 gets(text);
 
 printf("\n字串長度 : %d \n",strlen(text));
 printf("交換前 : %s \n",text);
 
 //字串顛倒 : 頭尾交換法
 tlen=strlen(text);
 for (i=0;i<tlen/2;i++)
      text[i]^=text[tlen-1-i]^=text[i]^=text[tlen-1-i];                 
 
 
 printf("交換後 : %s \n\n",text);

 pause();
 return 0;
}

http://img28.imageshack.us/img28/7124/swap1.png

getter 2011-07-24 11:05 AM

您的原始碼,迪西看不太懂,且迪西爛爛的 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;
}


bobo0836 2011-07-25 11:37 PM

謝謝getter,小弟以後會注意排版和註解,不過在下仍有一個疑問,程式碼如text[j]^=text[j+1]^=text[j]^=text[j+1];中^=是什麼意思?小弟找書上,好像找不到,煩請賜教!?

getter 2011-07-26 06:16 PM

引用:

作者: bobo0836 (文章 2281460)
謝謝getter,小弟以後會注意排版和註解,不過在下仍有一個疑問,程式碼如text[j]^=text[j+1]^=text[j]^=text[j+1];中^=是什麼意思?小弟找書上,好像找不到,煩請賜教!?

那個是 C/C++ 的運算子符號 ...

語法:

運算元

一元運算子:
運算順序:無
 
++:遞增                    * :指標間接運算子            ! :邏輯運算-反向閘(not)
--:遞減                    & :求記憶體位址              ~ :求 1 的補數
- :負數                    + :正數
sizeof:佔用記憶體的大小(運算順序:--)   


二元運算子:
運算順序:由左至右
 
+ :加                      - :減                        * :乘
/ :除                      % :餘數 ( 模數 )              <<:左偏移
>>:右偏移                  > :大於                      < :小於
>=:大於等於                <=:小於等於                  ==:邏輯(判斷式)等於
!=:不等於                  & :位元運算-及閘(AND)        | :位元運算-或閘(OR)+                 
^ :位元運算-互斥或閘(XOR)  &&:邏輯運算-及閘(AND)        ||:邏輯運算-或閘(OR)


運算順序:由右至左

= :指定為                  +=:遞增等於                  -=:遞減等於
*=:遞乘等於                /=:遞除等於                  %=:遞除餘數等於
<<=:左偏移等於              >>=:右偏移等於                &=:位元運算-及閘等於(AND)
!=:位元運算-或閘等於(OR)    ^=:位元運算-互斥或閘等於(XOR)

例: [ A=A+B  =  A+=B ] ;  [ A=A-B  =  A-=b ] ; [ A=A*B  =  A*=B ] ; [ A=A/B  =  A/=B ]


三元運算子:

? ::條件運算( A>B? printf("\nA big"): printf("\nB bing");)

至於是 x^=y^=x^=y; 就能讓兩個英數字元互換的 ^= 是很久以前老是有次上課
講的 ... 剛好老師看到某位同學的程式碼用 ^= 來做英數字元互換,並做講解 ...

原本是這樣的
語法:

使用  ^=          一般變數交換
x^=y;            temp=a;
y^=x;            a=b;
x^=y;            b=temp;

結果,某天迪西異想天開改成一行 x^=y^=x^=y; 竟然可以用 ...

不過某些類型的資料或是某些 windows SP 環境下 ^= 字元互換 會怪怪的 ...
導致資料或結果不正確 ...

至於使用變數的方式就沒辦法一行化了 ...,不過變數的話依類型宣告,結果
會很穩定的。

wenneng 2011-08-13 02:47 AM

題目是 "由鍵盤輸入一個字串,將字串以前後顛倒的順序印出來"

PHP 語法:

#include<stdio.h>
#include<stdlib.h>

char *move_to_end(char *ptrint *len){
    *
len 0;
    while(*
ptr != '\0'){
        
ptr++;
        (*
len)++;
    }
    return 
ptr;
}

void reverse_print(char *ptrint len){
    while(
len 0){
        
ptr--;
        
len--;
        
printf("%c", *ptr);
    }
}

int main (void)
{
    
char a[100], *ptr;
    
int len;

    
printf("Input a string:");
    
gets(a);

    
ptr move_to_end(a, &len);
    
printf("The string length is %d\n"len);
    
printf("The result is \"");
    
reverse_print(ptrlen);
    
printf("\"\n");
    
system("pause");
    return 
0;




所有時間均為台北時間。現在的時間是 05:59 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2025, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1