討論區快速選單
知識庫快速選單
傑米的攝影旅遊筆記 網路投保旅行平安險 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
確認一下, 字串與define比較應該不會比較到結束符號?
更改我的閱讀文章字型大小
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/17 上午 01:03:17
想確認一下,
c的字串(字元陣列) 與 #define的字串常數 比較是否相同時,
define字串常數 應該不會比較到 c字串(字元陣列)的結束符號吧?



作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 411 | 人氣 0 | 評價 1890 | 評價/貼文 4.6 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/17 上午 08:11:57
其他人我不清楚,但我看不懂你的問題描述。
你有沒有個例子可以說明一下?
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/17 上午 09:26:26
#define str "1234"
string str1 ="1234" ;
char* str2="1234" ;
compare str , str1 and str , str2
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/17 下午 10:44:20
比如
#define A "AABBCC"

char k[7]="AABBCC";

但c的字元陣列會在後面加空字元以變成字串
所以在比較的時候,會不會因為k陣列後面多一個空字元而比較結果是不同呢?






作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/17 下午 10:47:55
我在dev c++的編譯器測試上是能過的
但不知道其他編譯器是否也能過
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 411 | 人氣 0 | 評價 1890 | 評價/貼文 4.6 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/18 上午 07:54:08
define 的東西就只是在編譯流程之前的文字取代預處理程序而已,所以:

strcmp(A,k); 會變成 strcmp("AABBCC",k);
memcmp(A,k,7); 會變成 memcmp("AABBCC",k,7);

一切就和跟字面常數做操作是一樣的,而字串型態的字面常數當然會含有結尾空字元。
至於結果有沒有不同?看你做比較的時候有沒有考慮到結尾空字元了吧!
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/18 上午 09:13:19
launch debugger and open the watch window. trace codes step by step and will know its contents.
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/18 上午 10:53:31
>c的字串(字元陣列) 與 #define的字串常數 比較是否相同時,
>define字串常數 應該不會比較到 c字串(字元陣列)的結束符號吧?

首先, 「C-字串」(C-style string) 指的一定是有終結字元的字串. 先把這個確定下來.

但 C 程式裡的 字面字串 (string literal), 不一定是字元陣列. 如果你在程式裡寫: printf("abcde"), 這裡的 "abcde" 就不是字元陣列, 它是個指標, 指向 "abcde" 這個 C字串.

如果你寫:
  char s[] = "abcde";

's' 是個零終結的字元陣列. 但 "abcde" 不能算字元陣列, 也不是指標. 這裡的 "abcde" 是個初始值, 等於:
  char s[] = {'a', 'b', 'c', 'd', 'e', '\0'};
是 C 語言語法定義提供給程式員的一個方便寫法.

在這個的例子裡, 只有 s 是個有終結字元的字元陣列.

但在 C 語言裡, 字元不一定要有終結字元. C 語言定義允許這個寫法:
  char a[3] = "abc"; /* 例 2 */
它等於:
  char a[] = { 'a', 'b', 'c' }; /* 例 2A */

在這個例子裡, "abc" 也還是個初始值, 不是字元陣列, 也不是指標. 'a' 是個字元陣列, 但它沒有終結字元.

要注意的是, 例 2 的寫法在 C++ 是不允許的. 要定義並初始化一個沒有終結字元的字元陣列, C++ 必須用 例 2A 的寫法.

如「燃燒」大大所言, #define 是在編譯前的文字取代, 它本身沒有語法上的意義, 作用必須看取代後的句子而定:
む例 3め
  #define TEXT "abcde"
  char s[] = TEXT; /* 3A */
  char a[5] = TEXT; /* 3B */
  printf(TEXT); /* 3C */

在 3A 跟 3B, TEXT 所代表的是個初始值, 不是字元陣列, 也不是指標. 在 3C 哪裡, 它代表指標, 指向 "abcde" 這個 C-字串.

字面字串 (string literal) 只要不是用在初始值的情況下, 都是個指標, 指向 C-字串 (有終結字元).

作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/18 下午 04:23:54

>define 的東西就只是在編譯流程之前的文字取代預處理程序而已,所以:
>
>strcmp(A,k); 會變成 strcmp('AABBCC',k);
>memcmp(A,k,7); 會變成 memcmp('AABBCC',k,7);
>
>一切就和跟字面常數做操作是一樣的,而字串型態的字面常數當然會含有結尾空字元。
>至於結果有沒有不同?看你做比較的時候有沒有考慮到結尾空字元了吧!

陣列k我有多留個元素空位給空字元
那這樣會比較錯誤嗎?
因為比define多出一個字元
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 411 | 人氣 0 | 評價 1890 | 評價/貼文 4.6 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/18 下午 05:16:10
基本上 Raymond 大已經解釋的很詳細了!

不過我發現你有點雞同鴨講的狀況,可能是我們沒聽懂你真正的疑惑,以至於這些解答不能幫到你。
你要不要拿一段你真正實際上遭遇疑惑的程式碼來給我們看看?
還有,不要說「這樣會不會有問題」這樣的話;請盡可能化成實際的案例,告訴我們像是這樣的敘述,看看能不能讓人比較能真正明白你的問題點在哪裡:
「某某東西在我的認知下應該會跑出3,但實際上會不會有別的編譯器因為某些某些理由跑出5」
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/18 下午 07:03:54

>基本上 Raymond 大已經解釋的很詳細了!
>
>不過我發現你有點雞同鴨講的狀況,可能是我們沒聽懂你真正的疑惑,以至於這些解答不能幫到你。
>你要不要拿一段你真正實際上遭遇疑惑的程式碼來給我們看看?
>還有,不要說「這樣會不會有問題」這樣的話;請盡可能化成實際的案例,告訴我們像是這樣的敘述,看看能不能讓人比較能真正明白你的問題點在哪裡:
>「某某東西在我的認知下應該會跑出3,但實際上會不會有別的編譯器因為某些某些理由跑出5」

重看了一遍,有比較懂了
但還是有些問題,
我等等再問
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/18 下午 08:50:16
>>define 的東西就只是在編譯流程之前的文字取代預處理程序而已,所以:
>>
>>strcmp(A,k); 會變成 strcmp("AABBCC',k);
>>memcmp(A,k,7); 會變成 memcmp("AABBCC",k,7);
>>
>>一切就和跟字面常數做操作是一樣的,而字串型態的字面常數當然會含有結尾空字元。
>>至於結果有沒有不同?看你做比較的時候有沒有考慮到結尾空字元了吧!
>
>陣列k我有多留個元素空位給空字元
>那這樣會比較錯誤嗎?
>因為比define多出一個字元

基本上, 所有處理「字串」的函式, 「字串參數』都必須是個指向 C-字串 的指標, 也就是一個有終結字元的字元列. 原因很簡單: 因為在 C 語言裡, 你無法從指標處得知它指向多少個元素, 字串處理函式只能依賴終結字元來判斷何時該結束它的動作.
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/18 下午 10:04:13

>>c的字串(字元陣列) 與 #define的字串常數 比較是否相同時,
>>define字串常數 應該不會比較到 c字串(字元陣列)的結束符號吧?
>
>首先, 「C-字串」(C-style string) 指的一定是有終結字元的字串. 先把這個確定下來.
>..............
>........
>.......


我知道你想表達的了

我本來就知道字串常數 不等於 字元陣列(字串)

我的問題是
#define A "AABBCC"

char k[7]="AABBCC";

用strcmp兩個作比較

if(strcmp(k,A)==0)
   printf("Passed \n");


定義A的第一字元A與k陣列元素0的A作比較,
比到最後的C,
但k陣列最後面還有一個空字元,定義A沒有
所以我那時候想應該是比較失敗,但還是過了
但k不是比定義A多出一個空字元嗎?


想問各位,為甚麼會過?


作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/18 下午 10:12:22
再補充一下, 你原題目講的是「比較」, 所以用的應該是 strcmp(), strncmp() 或 memcmp(). 建議你先去看看這幾個函式的相關說明.

  http://www.cplusplus.com/reference/cstring/strcmp/
  http://www.cplusplus.com/reference/cstring/strncmp/
  http://www.cplusplus.com/reference/cstring/memcmp/

說明裡有提到「比較」結束的條件, 這是你要特別注意的地方.
strcmp() 跟 strncmp() 的共同結束條件是: 字元不同或遇到終結字元. strncmp() 加多一個條件, 就是前 n 個字元.
memcmp() 的結束條件是: 字元不同或已比較了 n 個字元為止.

會不會比較到終結符號? 答案是不一定. 如果在比較的過程中發現兩個字元不同, 就沒有必要繼續往下走.

另一個建議, 你自己嘗試寫一個字串比較函式, 這對你對字串的了解會有幫助.
作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/18 下午 11:22:10

>再補充一下, 你原題目講的是「比較」, 所以用的應該是 strcmp(), strncmp() 或 memcmp(). 建議你先去看看這幾個函式的相關說明.
>
>  http://www.cplusplus.com/reference/cstring/strcmp/
>  http://www.cplusplus.com/reference/cstring/strncmp/
>  http://www.cplusplus.com/reference/cstring/memcmp/
>
>說明裡有提到「比較」結束的條件, 這是你要特別注意的地方.
>strcmp() 跟 strncmp() 的共同結束條件是: 字元不同或遇到終結字元. strncmp() 加多一個條件, 就是前 n 個字元.
>memcmp() 的結束條件是: 字元不同或已比較了 n 個字元為止.
>
>會不會比較到終結符號? 答案是不一定. 如果在比較的過程中發現兩個字元不同, 就沒有必要繼續往下走.
>
>另一個建議, 你自己嘗試寫一個字串比較函式, 這對你對字串的了解會有幫助.
>


對,我有想過看原比較函式定義
但是是原文,所以看不懂

但你的意思我不明白
假如兩個字元不同接下來不用比這我懂
但為什麼陣列與定義比較時會不會比到陣列的空字元
是不一定的?

能否說明一下嗎
什麼狀況會比到空字元之類的


作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/19 上午 07:44:24
>對,我有想過看原比較函式定義
>但是是原文,所以看不懂

學寫程式, 讀懂說明文件是一個必須的能力.

>但你的意思我不明白
>假如兩個字元不同接下來不用比這我懂
>但為什麼陣列與定義比較時會不會比到陣列的空字元
>是不一定的?
>
>能否說明一下嗎
>什麼狀況會比到空字元之類的

遭遇到不同字元時當然不會繼續往下走到終結字元:
  strcmp("abcde", "12345");

如使用的函式有長度限定, 且長度小於所比較字串的長度, 當然也不會碰到終結字元:
  strncmp("abcde", "axxxx", 1);

強烈的建議你自己去寫一個字串比較的函式. 有些東西一定要自己動手做才會深入了解.
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 411 | 人氣 0 | 評價 1890 | 評價/貼文 4.6 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/19 上午 07:49:18
>對,我有想過看原比較函式定義
>但是是原文,所以看不懂

這裡修正你一個錯誤,他不是「原文」,而是「英文」。
如果是原文你看不懂的話,我們都可以理解的,像是 Nginx 的原文說明文件。

>但你的意思我不明白
>假如兩個字元不同接下來不用比這我懂
>但為什麼陣列與定義比較時會不會比到陣列的空字元
>是不一定的?

你自己做個小作業練習一下也許就理解了,請你自己實做一個 strcmp 函式出來並測試你想要的各種狀況,然後再討論。
作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/19 上午 10:14:13
>但k陣列最後面還有一個空字元,定義A沒有
>所以我那時候想應該是比較失敗,但還是過了
>但k不是比定義A多出一個空字元嗎?
>想問各位,為甚麼會過?

過了 就表示內容一樣
表示它要比較的就是內容
跟本不去管結束字元
重點就是“它只比較內容”
你在“結束字元”上鑽牛角尖也只是浪費時間而已
因為那個函式裡面通常就是用判斷是否是結束字元來結束迴圈
當然不會被比較到

作者 : kotty123(存在)
[ 貼文 56 | 人氣 0 | 評價 10 | 評價/貼文 0.18 | 送出評價 12 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/19 下午 01:25:18

我會自己去試寫一個比較函式
謝謝各位的回覆

但等等我可能會開新問題問各位有關於
我想的一些陣列
是字串(字元陣列+\0) 還是 純粹放字元的字元陣列



還請各位幫忙,謝謝
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/8/19 下午 03:18:44
http://lxr.free-electrons.com/source/lib/string.c
reading some exiting codes is a good way that can improve your programming skills.
please see codes from line 256 to 270
 板主 : simula
 > C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
C++
1 Raymond 13050 
2 青衫 4760 
3 simula 4690 
4 coco 4030 
5 白老鼠(Gary) 3670 
6 ozzy 2540 
7 Ben 2250 
8 Anderson 1960 
9 windblown 1650 
10 Kenny 1560 
C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.203125