伊莉討論區

標題: 一個小問題 關於空白鍵 [打印本頁]

作者: free576002    時間: 2012-12-17 01:34 PM     標題: 一個小問題 關於空白鍵

我的作業是用陣列把輸入的英文字母轉換成數字A=0 B=1這樣子
程式碼我已經寫出來了
執行也都正確
但是

只要輸入有空白的
像是 G O D
他就會顯示 6,-65, 14, -65, 3
簡單來說
空白鍵在轉換的時候變成-65了
有什麼辦法能夠讓空白輸出變成
6 14 3 這樣呢 ?



作者: snowflying    時間: 2012-12-17 05:05 PM

本帖最後由 snowflying 於 2012-12-17 05:09 PM 編輯

C ?  C++?
讀到換行?
只有大寫和空白?
原來的程式碼?

可以將問題說明的清楚一點嗎?
不然不知道要怎麼回答
只好猜測

  1. int i = 0, len = strlen(str);
  2. for(int i = 0 ; i < len; ++i)
  3. {
  4.     if(str[i] == ' ')
  5.         cout << ' ';
  6.     else
  7.         cout << str[i] - 'A';
  8. }
複製代碼


作者: free576002    時間: 2012-12-17 11:25 PM

本帖最後由 free576002 於 2012-12-17 11:35 PM 編輯
snowflying 發表於 2012-12-17 05:05 PM
C ?  C++?
讀到換行?
只有大寫和空白?

程式碼 我私信了 他不給我傳 不好意思
我想要他列印出來的時候 6,-65,14,-65,3
-65能變成一個空白 像這樣子 6 14 3
還有能使用strlwr 讓使用者不管輸入大小寫都可使用嗎?
不好意思 麻煩妳了這是C語言
複製代碼
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. main() {  
  5.        char op[] =""
  6.        int i =0;//
  7.        gets(op);
  8.        strlen(op);
  9.       
  10. for(i=0;i<strlen(op);i++)
  11.   if (strlen(op)-1>i)
  12.   列印("(%d),",(op[i]-97));
  13.     else 列印("(%d)\n",op[i]-97);
  14. system("pause");
  15. return 0;
  16. }
複製代碼



作者: chevylin0802    時間: 2012-12-17 11:44 PM

free576002 發表於 2012-12-17 11:25 PM
程式碼 我私信了 他不給我傳 不好意思
我想要他列印出來的時候 6,-65,14,-65,3
-65能變成一個空白 像這樣 ...

空白鍵的ASCII 為0x20
所以當你字裏有空白的時候, 必然會出現負數
這是你的程式裏沒有把所輸入的字元做'A'~'z'的判斷所造成的結果
你應該在op這個地方做檢查
if((op>='A') && (op<='z')) {
     列印op-97
}
作者: free576002    時間: 2012-12-17 11:51 PM

chevylin0802 發表於 2012-12-17 11:44 PM
空白鍵的ASCII 為0x20
所以當你字裏有空白的時候, 必然會出現負數
這是你的程式裏沒有把所輸入的字元做'A ...

在op的地方做檢查
是指strlen[op]還是?

由於我剛接觸陣列 還是不太懂
我剛有試著將你所說的判斷+上去
但結果大寫會是負數
我希望 不管是大寫的A或是小寫的A輸入進去所轉換出來都為0
作者: chevylin0802    時間: 2012-12-17 11:58 PM

本帖最後由 chevylin0802 於 2012-12-17 11:58 PM 編輯
free576002 發表於 2012-12-17 11:51 PM
在op的地方做檢查
是指strlen[op]還是?


每一個字元都要分別比較
op〔i〕
作者: snowflying    時間: 2012-12-18 12:22 AM

本帖最後由 snowflying 於 2012-12-18 12:27 AM 編輯
free576002 發表於 2012-12-17 11:25 PM
程式碼 我私信了 他不給我傳 不好意思
我想要他列印出來的時候 6,-65,14,-65,3
-65能變成一個空白 像這樣 ...


抱歉,剛在打 project,比較晚回復
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int main()
  5. {
  6.     //char op[] ="";  //這樣陣列大小會是 0 ,會造成問題
  7.    char op[1000];    //之後學到動態配置,可以使用該方式
  8.    int i = 0;
  9.     gets(op);
  10.     //strlen(op);   //這行回傳值並未使用,所以不需要這一行

  11.    for(i=0;i<strlen(op);i++)
  12.     {
  13.         if ( ('A' <= op[i] && op[i] <= 'Z') || ('a' <= op[i] && op[i] <= 'z') )
  14.             //判斷字元範圍  ascii 'A' = 65 , 'a' = 97
  15.             print f("%d", op[i]%32 - 1 );
  16.         else
  17.             print f("%c",op[i]); //非英文字母,應該是以char 型態輸出吧?
  18.     }
  19.     print f("\n");
  20.     system("pause");
  21.     return 0;
  22. }
複製代碼
strlwr 是非標準式,所以不建議使用,自己寫一個其實很簡單

('A' <= op i && op i  <= 'Z') || ('a' <= op i  && op i  <= 'z')
這一句,可以使用 #include <ctype.h>     isalpha(op i)

作者: free576002    時間: 2012-12-18 09:29 AM

snowflying 發表於 2012-12-18 12:22 AM
抱歉,剛在打 project,比較晚回復 strlwr 是非標準式,所以不建議使用,自己寫一個其實很簡單

('A'  ...

謝謝解答
老實說 題目大約是這樣 (我沒有全部講完
我只跟你說大概
因為我想自己完成 請見諒哦

我在自己試試看 如果還是不行
還希望你能指點我
作者: free576002    時間: 2012-12-18 10:04 AM

本帖最後由 free576002 於 2012-12-18 10:07 AM 編輯
snowflying 發表於 2012-12-18 12:22 AM
抱歉,剛在打 project,比較晚回復 strlwr 是非標準式,所以不建議使用,自己寫一個其實很簡單

('A'  ...
  1.         if ( ('A' <= op[i] && op[i] <= 'Z') || ('a' <= op[i] && op[i] <= 'z') )
  2.             //判斷字元範圍  ascii 'A' = 65 , 'a' = 97
  3.             print f("%d", op[i]%32 - 1 );
  4.         else
  5.             print f("%c",op[i]); //非英文字母,應該是以char 型態輸出吧?
  6.     }
複製代碼
我想還是會用到strlen 因為我剛嘗試了一下
if ( ('A' <= op && op <= 'Z') || ('a' <= op && op <= 'z') )
if (strlen(op)-1>i) //這段我想拿來判斷是否要+, 輸入A顯示 (0) 輸入AB顯示(0),(1)
                            輸入ABC顯示(0),(1),(2) 這個樣子 逗號的判斷依照我原po的程式碼
                            是可以執行的 我曾嘗試利用我原本的概念去寫 但他好像不會執行這段

print f("(%d),", op%32 - 1 );//輸出答案有,但他最後一個位元也會有 像(0),(1),(2),

else print f("(%d)\n",op%32 - 1);//最後一個字元不加逗號
-
第二段的if似乎無法執行 所以我想問的是
這樣子的寫法 是第一段if執行完後再執行第二段if接著列印
還是 他只會跑第一段if 只要通過就不跑第二段了
還有這種寫法算是巢式嗎 ?

如果要達到我的用法 請問該如何做修改
Strlwr 是非標準式 為何不建議使用呢 ?
問題有點多 還勞煩你解答了



作者: snowflying    時間: 2012-12-18 11:19 AM

本帖最後由 snowflying 於 2012-12-18 11:31 AM 編輯
free576002 發表於 2012-12-18 10:04 AM
我想還是會用到strlen 因為我剛嘗試了一下
if ( ('A'

  1.         if ( ('A' <= op[i] && op[i] <= 'Z') || ('a' <= op[i] && op[i] <= 'z') )
  2.         {
  3.             //判斷字元範圍  ascii 'A' = 65 , 'a' = 97
  4.             if(i != strlen(op)-1)
  5.                 print f("(%d),", op[i]%32 - 1 );
  6.             else
  7.                 print f("(%d)", op[i]%32 - 1 );
  8.         }
  9.         else
  10.             print f("%c",op[i]); //非英文字母,應該是以char 型態輸出吧?
複製代碼
那就最後一次不要加逗號就好啦
我想應該只有 ABC轉換成數字的部分才需要吧?

另外, 如果確定第一個輸入的為英文字母
可以使用:
  1.         if ( ('A' <= op[i] && op[i] <= 'Z') || ('a' <= op[i] && op[i] <= 'z') )
  2.             //判斷字元範圍  ascii 'A' = 65 , 'a' = 97
  3.                 print f(",(%d)"+(i == 0), op[i]%32 - 1 );
  4.         else
  5.             print f("%c",op[i]); //非英文字母,應該是以char 型態輸出吧?
複製代碼

strlen  用在迴圈上,除非確定長度不大,不然盡量先將他的值存放進一個變數

len = strlen(op);
for (i = 0 ; i < len ; ++i)

不然op如果大到100萬甚至以上
每次迴圈呼叫,strlen(op) 跑了好幾次,時間是很長的
半年前,我就是直接放在裡面,程式跑了好幾分鐘都沒出來(檔案操作,陣列長度約65萬)
改成上面那種方式,不到2秒,所以使用前最好先評估一下


作者: shadow30700    時間: 2012-12-18 12:58 PM

提示: 作者被禁止或刪除 內容自動屏蔽
作者: free576002    時間: 2012-12-18 01:17 PM

snowflying 發表於 2012-12-18 11:19 AM
那就最後一次不要加逗號就好啦
我想應該只有 ABC轉換成數字的部分才需要吧?
  1. if ( ('A' <= op[i] && op[i] <= 'Z') || ('a' <= op[i] && op[i] <= 'z') )
  2.         {
  3.             //判斷字元範圍  ascii 'A' = 65 , 'a' = 97
  4.             if(i == 0x20) // 這一行我拿來判斷是否為空格
  5.                 print f(" ");
  6.             else
  7.                 print f(",(%d)"+(i != 1), op[i]%32 - 1 ); //而這一行的"+(i != 1) 我有些不解
  8.         }                                                              可否為我解答呢 ?
  9.         else
  10.             print f("%c",op[i]); //非英文字母,應該是以char 型態輸出吧?
複製代碼
懂了

現在Try也ok了
但是 如果+上空白
Ex : God Is Good = (6),(14)(3) (8)(18) (6)(14)(14)(3)
              正解為 = (6),(14),(3) (8),(18) (6),(14),(14),(3)
也就是只有前兩個字母有, 而後面雖然空格問題已修正但卻少了,


作者: snowflying    時間: 2012-12-18 06:20 PM

shadow30700 發表於 2012-12-18 12:58 PM
抱歉我是新手
剛看了一下
如果用while迴圈判斷

可以, strlen 也是去檢查'\0'
作者: snowflying    時間: 2012-12-18 06:28 PM

free576002 發表於 2012-12-18 01:17 PM
懂了

現在Try也ok了

原來題目是要求這樣唷, 可以一次把要求都說完啊
  1. int start = 1; // 判斷是否為該單字開頭
  2. for(i=0;i<strlen(op);i++)
  3. {
  4.      if ( ('A' <= op[i] && op[i] <= 'Z') || ('a' <= op[i] && op[i] <= 'z') )
  5.     {
  6.          if(start == 1)
  7.         {
  8.              print f("(%d)", op[i]%32 - 1 );
  9.              start = 0;
  10.         }
  11.         else
  12.              print f(",(%d)", op[i]%32 - 1 );
  13.     }
  14.     else
  15.     {
  16.          print f("%c",op[i]); //非英文字母,應該是以char 型態輸出吧?
  17.          start = 1;
  18.     }
  19. }
複製代碼

作者: free576002    時間: 2012-12-18 06:59 PM

snowflying 發表於 2012-12-18 06:28 PM
原來題目是要求這樣唷, 可以一次把要求都說完啊

因為我想要自己嘗試看看
我不喜歡把題目丟給人家
然後等答案

我喜歡嘗試看看 再去提問
不好意思 造成你的困擾了~"~
作者: free576002    時間: 2012-12-18 07:04 PM

snowflying 發表於 2012-12-18 06:28 PM
原來題目是要求這樣唷, 可以一次把要求都說完啊
  1.      if ( ('A' <= op[i] && op[i] <= 'Z') || ('a' <= op[i] && op[i] <= 'z') )
  2.     {
  3.          if(start == 1)
  4.         {
  5.              print f("(%d)", op[i]%32 - 1 );
  6.              start = 0;
  7.         }
  8.         else
  9.              print f(",(%d)", op[i]%32 - 1 );
  10.     }
  11.     else
  12.     {
  13.          print f("%c",op[i]); //非英文字母,應該是以char 型態輸出吧?
  14.          start = 1;
  15.     }
複製代碼
第一個if是判斷A-z
請問第二個if以及start是什麼意思呢 ?
為何要先宣告start=1呢 ?
以及最後一個else的用處是什麼
麻煩你解答了
我到第一個if之後 就看不太懂 他在做什麼了
作者: snowflying    時間: 2012-12-18 09:50 PM

本帖最後由 snowflying 於 2012-12-18 09:54 PM 編輯
free576002 發表於 2012-12-18 07:04 PM
第一個if是判斷A-z
請問第二個if以及start是什麼意思呢 ?
為何要先宣告start=1呢 ?


start  是判斷是不是單字開頭 像 A dog is there.
A  d   i  t  都是開頭
所以一剛開始start 為1
取得開頭後, start 為0 , 表示這時候為 該單字的後面部分
而遇到其他非英文字元 表示該單字結束, start 又回到 1

if 開頭 輸出   "(%d)"    dog 的d  =>  (3)
else (不是開頭) 輸出  ", (%d)" => dog 的og => ,(14),(6)
合起來就變成 (3),(14),(6)

作者: free576002    時間: 2012-12-19 09:11 AM

snowflying 發表於 2012-12-18 09:50 PM
start  是判斷是不是單字開頭 像 A dog is there.
A  d   i  t  都是開頭
所以一剛開始start 為1

所以Start是會去判斷每個輸入是否為單字囉
假如輸入ABC則對A B C做三次判斷?

作者: snowflying    時間: 2012-12-19 11:57 AM

本帖最後由 snowflying 於 2012-12-19 11:57 AM 編輯
free576002 發表於 2012-12-19 09:11 AM
所以Start是會去判斷每個輸入是否為單字囉
假如輸入ABC則對A B C做三次判斷?
...


如果是連續的ABC
與其說對A B C做三次判斷
不如說判斷 Start

                       ABC     DEF
讀取之前start    100  0 100
讀取之後start    000  1 000
作者: snowflying    時間: 2012-12-20 12:12 AM

free576002 發表於 2012-12-19 09:11 AM
所以Start是會去判斷每個輸入是否為單字囉
假如輸入ABC則對A B C做三次判斷?
...

少回覆一個問題
strlwr 是非標準式,如果依賴他,在不支援的情況下,還是得重刻一個
在學習的時候少用, 我看過好幾位開非標準式的(stricmp),
結果某次在linux上無法compile 時, 想了好久還是刻不出來
所以還是先學著怎麼自己動手, 初學的時候, 盡量別貪圖方便
作者: free576002    時間: 2012-12-20 10:56 PM

snowflying 發表於 2012-12-20 12:12 AM
少回覆一個問題
strlwr 是非標準式,如果依賴他,在不支援的情況下,還是得重刻一個
在學習的時候少用,  ...

了解
謝謝你的幫助及詳細的解答




歡迎光臨 伊莉討論區 (http://www18.eyny.com/) Powered by Discuz!