找回密碼 或 安全提問
 註冊
|註冊|登錄

伊莉討論區

搜索
發表文章前請先閱讀相關版規尊貴會員無限觀看附件圖片尊貴會員無限看帖不用回覆
mg神奇寶貝無修波多野結julia無碼 meg高中
月關start 02武藤あやリステメ進擊羔羊コイカツmmt 019

休閒聊天興趣交流學術文化旅遊交流飲食交流家庭事務PC GAMETV GAME
熱門線上其他線上感情感性寵物交流家族門派動漫交流貼圖分享BL/GL
音樂世界影視娛樂女性頻道潮流資訊BT下載區GB下載區下載分享短片
電腦資訊數碼產品手機交流交易廣場網站事務長篇小說體育運動時事經濟
上班一族博彩娛樂

[繁]肌肉魔法使-MASHL

[繁]超龍珠英雄MM 02-

TVアニメ『一拳超人

[繁]葬送的芙莉蓮25-

[繁]因為不是真正的夥

[繁]月光下的異世界之
C & C++ 語言C# 語言Visual Basic 語言PHP 語言JAVA 語言
查看: 5820|回復: 22

[問題] C++字串比較問題[複製鏈接]

Rank: 2Rank: 2

帖子
543
積分
587 點
潛水值
10540 米
發表於 2018-7-2 11:50 AM|顯示全部樓層
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。
本帖最後由 jackyo04 於 2018-7-5 08:51 AM 編輯

我程式會依照需求,產生N個字串,但每個字串又不能重複,字串的內容是根據條碼機而來的,目前是用了笨方法,我用"strcmp"跟每個字串做比較,譬如我有4個字串,我就讓每個字串比較3次,但程式碼都是一大串...有沒有比較聰明的方式呢?
以下是我目前用的方法..舉利來說:我有4個字串要比較->先將字串轉成char->寫兩層for迴圈如下:
...
瀏覽完整內容,請先 註冊登入會員
成為伊莉的版主,你將獲得更高級和無限的權限。把你感興趣的版面一步步地發展和豐盛,那種滿足感等著你來嚐嚐喔。

使用道具檢舉

帖子
41
積分
0 點
潛水值
2070 米
發表於 2018-7-2 10:20 PM|顯示全部樓層
回覆中加入附件並不會使你增加積分,請使用主題方式發佈附件。
可以試試用hashmap把每個字串存下來
然后每有一個新的字串,就用hashmap來搜索一下?
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

Rank: 2Rank: 2

帖子
543
積分
587 點
潛水值
10540 米
發表於 2018-7-3 08:37 AM|顯示全部樓層
DuckPigPig 發表於 2018-7-2 10:20 PM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

可以試試用hashmap把每個字串存下來
然后每有一個新的字串,就用hashmap來搜索一下? ...

我目前是用兩層迴圈來判斷4個字串內有沒有重複,條碼都是印好的,只是判斷當下的4個字串有沒有重複,目前只是測試而已,之後可能擴充到100筆吧,目前執行下來速度還可以接受,還在找bug中,晚點測試100筆的狀況,hashmap好像是JAVA的東西,在我的BCB上找不太到,儲存量大的話會不會影響效率呢?因為可能一天會有幾千筆甚至幾萬筆都有可能.....
瀏覽完整內容,請先 註冊登入會員

點評

jackyo04 4樓的@@  發表於 2018-7-5 08:52 AM
jackyo04 我有上網看了一下資料,就如樓下所說的一樣,資料量大一點計算的時間就會相對拉長  發表於 2018-7-4 10:46 AM
snowflying C++ 裡面用 map 或 set,如果是 C++11 可以用 unordered_map、unordered_set  發表於 2018-7-3 04:28 PM
若瀏覽伊莉的時侯發生問題或不正常情況,請使用Internet Explorer(I.E)。

使用道具檢舉

Rank: 2Rank: 2

帖子
475
積分
967 點
潛水值
31439 米
發表於 2018-7-4 01:37 AM|顯示全部樓層
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php
本帖最後由 baepi 於 2018-7-5 01:38 AM 編輯

撰寫方式一點都不難...重點在於你的判斷式....真的要把所有比較暫存起來?很抱歉深夜隨手亂寫的程式就是糟糕...我寫的範例錯太大了...已修正
以下程式碼
另外...BCB幾萬年沒去碰過了...自從VS2005出了以後我就對它失去興趣...因此比較字串陣列我不知道是否有list可以使用...有的話就可以自由伸縮了
...
瀏覽完整內容,請先 註冊登入會員
所有積分大於負-100的壞孩子,將可獲得重新機會成為懲罰生,權限跟幼兒生一樣。

使用道具檢舉

Rank: 2Rank: 2

帖子
543
積分
587 點
潛水值
10540 米
發表於 2018-7-4 08:56 AM|顯示全部樓層
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php
baepi 發表於 2018-7-4 01:37 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

撰寫方式一點都不難...重點在於你的判斷式....真的要把所有比較暫存起來?我隨便寫個10筆就幾萬個點了....10 ...

list這東西是有的,我來改看看,程式就是要討論才會進步...
瀏覽完整內容,請先 註冊登入會員





若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com

使用道具檢舉

Rank: 2Rank: 2

帖子
475
積分
967 點
潛水值
31439 米
發表於 2018-7-4 02:32 PM|顯示全部樓層
不知是我表達能力太差還是我理解能力太差....聽不太明白大大想表達的意思
首先...我是看到大大在一樓的留言範例
  1. if(i0 == i1 && i0 == i2 && i0 == i3 && i0 == i4 && i0 == i5)
  2. // 動作
複製代碼
這段我不知用來判斷甚麼?
如果只是要判斷\字串之間是否有重複....那只需...如下
  1. #include<iostream>
  2. #include<windows.h>
  3. #include<string>
  4. using namespace std;

  5. const int max_count = 4;
  6. string str[max_count];
  7. //隨意填值...反正是測試
  8. void set_data()
  9. {
  10.         /*for (int i = 0; i < max_count; i++)
  11.         {
  12.                 str[i] = i + 48;
  13.         }*/
  14.         str[0] = "ABC";
  15.         str[1] = "ABCD";
  16.         str[2] = "BC";
  17.         str[3] = "ABCD";
  18. }
  19. void logic()
  20. {
  21.         bool c1 = false;
  22.         for (int i = 0, ii = 0; i < max_count; i++)
  23.         {
  24.                 for (int j = i + 1; j < max_count; j++, ii++)
  25.                 {
  26.                         if (strcmp(str[i].c_str(), str[j].c_str()) == 0)//代表相同
  27.                         {
  28.                                 c1 = true;
  29.                                 cout << "index = " << i << " 的 " << str[i] << " 和 " << "index = " << j << " 的 " << str[j] << " 是一樣的\n";
  30.                                 //break;//若是抓到一樣就中斷的話....
  31.                         }
  32.                         //cout << "前比較字串index = " << i << "\t後比較字串index = " << j << "\t結果存於布林index = " << ii << "\n";
  33.                 }
  34.         }
  35.         if (c1)//有字串是一樣的
  36.         {
  37.                 //動作
  38.         }
  39. }
  40. void main()
  41. {
  42.         set_data();
  43.         logic();
  44.         system("pause");
  45. }
複製代碼
另外...被大大在一樓的範例誤導 + 我也沒注意...strcmp的回傳是int型態等於0表示兩字串相等...等於1與等於-1都是不相等....所以不能用bool型態紀錄...因為0跟-1都算false...
瀏覽完整內容,請先 註冊登入會員

點評

jackyo04 我測試strcmp分別用int與bool測試過,字串完全相同會傳回0,其餘的是傳非0的數值,所以改了判斷,if(i0 != 0 && i1 !=0 && i2 != 0 && i3 != 0 && i4 != 0)   發表於 2018-7-5 08:36 AM
snowflying 7 樓有提到了,strcmp 回傳值是分成 < 0、 == 0、> 0,不是只有 0 1 -1 喔  發表於 2018-7-5 12:55 AM
若對尊貴或贊助會員有任何疑問,歡迎向我們查詢。我們的即時通或MSN: admin@eyny.com

使用道具檢舉

Rank: 2Rank: 2

帖子
1051
積分
619 點
潛水值
27270 米
發表於 2018-7-4 05:08 PM|顯示全部樓層
jackyo04 發表於 2018-7-4 08:56 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

list這東西是有的,我來改看看,程式就是要討論才會進步,對吧
我的作法是將每個String先轉成char ...

1. 不知道你的string 是那種string
...
瀏覽完整內容,請先 註冊登入會員

點評

cockroachrun 轉成的內容也不是char .是char 指標. 只向的位置要有足夠的空間存放內容.請小心  發表於 2018-7-5 10:43 AM
snowflying StrPCopy 不是 C/C++ 標準的,而且使用複製的方式,可能會比較慢  發表於 2018-7-5 10:15 AM
jackyo04 我是透過StrPCopy的方法將String轉成char  發表於 2018-7-5 08:54 AM
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。

使用道具檢舉

帖子
59
積分
28 點
潛水值
11690 米
發表於 2018-7-5 12:04 AM|顯示全部樓層
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。
用std::vector與std::find 不知道能否達成您的要求...
底下為簡單範例...給您參考看看....
  1. #include <iostream>
  2. #include <vector>  
  3. #include <string>

  4. using namespace std;

  5. void ShowData(vector<string> Arr)
  6. {
  7.         vector<string>::pointer data_ptr;

  8.         data_ptr = Arr.data();
  9.        
  10.         for (size_t n = Arr.size(); 0 < n; --n, data_ptr++)
  11.    {
  12.            cout<<*data_ptr<<"\n";
  13.    }
  14. }

  15. bool isExisted(vector<string> Arr, string InputData)
  16. {
  17.         return (find(begin(Arr), end(Arr), InputData)!=end(Arr));
  18. }

  19. void main()
  20. {
  21.         vector<string> sArr;
  22.        
  23.         sArr.push_back("abc");
  24.         sArr.push_back("ab");
  25.         sArr.push_back("acd");
  26.         sArr.push_back("bc");

  27.         string input="a";
  28.           
  29.         if (isExisted(sArr, input))       
  30.                 cout<<"String "<<input<<" is already existed !\n";
  31.         else
  32.             sArr.push_back(input);   
  33.    
  34.         ShowData(sArr);

  35.         system("pause");
  36. }
複製代碼
...
瀏覽完整內容,請先 註冊登入會員

點評

snowflying find 要 #include <algorithm>,每一次都是線性的,所以不快。而函式傳入 vector<string> Arr 不是用 reference,每次都要複製一份新的,也會影響速度。  發表於 2018-7-5 12:54 AM
snowflying 應該是 Arr.begin()、Arr.end() 吧  發表於 2018-7-5 12:48 AM

使用道具檢舉

  尊貴會員

Melty Snow  雪靈

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
3222
積分
24364 點
潛水值
76910 米
發表於 2018-7-5 12:42 AM|顯示全部樓層
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。
本帖最後由 snowflying 於 2018-7-5 03:18 AM 編輯
我有上網看了一下資料,就如樓下所說的一樣,資料量大一點計算的時間就會相對拉長

不知道 "樓下" 是哪一層樓,底下沒看到有人說這個量大很慢
如果你的資料量是算億的,那麼你需要的是分散式資料庫之類的東西


基本上 map、set 是基於樹狀的資料結構,建完的時間複雜度 O(nlogn),詢問 O(logn)
...
瀏覽完整內容,請先 註冊登入會員
Melty Snow [雪靈]
若新密碼無法使用,可能是數據未更新。請使用舊密碼看看。

使用道具檢舉

Rank: 2Rank: 2

帖子
475
積分
967 點
潛水值
31439 米
發表於 2018-7-5 01:34 AM|顯示全部樓層
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。
本帖最後由 baepi 於 2018-7-5 01:38 AM 編輯
snowflying 發表於 2018-7-5 12:42 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

不知道 "樓下" 是哪一層樓,底下沒看到有人說這個量大很慢
如果你的資料量是算億的,那麼你需要的是分散式 ...
...
瀏覽完整內容,請先 註冊登入會員





點評

jackyo04 我用bool測試了很多次,字串也是我隨機給的(英文數字參雜),沒有誤判耶..  發表於 2018-7-5 09:04 AM
jackyo04 我是用C++ Builder測試,用單純的String轉成char後比較,將String設為"aaa"來比,測出的值會有-2,-3,-4....或2,3,4...之類的結果發生  發表於 2018-7-5 09:02 AM
若有安裝色情守門員,可用無界、自由門等軟件瀏覽伊莉。或使用以下網址瀏覽伊莉: http://www.eyny.com:81/index.php

使用道具檢舉

  尊貴會員

Melty Snow  雪靈

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
3222
積分
24364 點
潛水值
76910 米
發表於 2018-7-5 03:12 AM|顯示全部樓層
如果瀏覽伊莉時速度太慢或無法連接,可以使用其他分流瀏覽伊莉,www01.eyny.com(02,03)。
baepi 發表於 2018-7-5 01:34 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

回復snowflying大大
strcmp我是根據自己之前的印象去說明的...或許說明有誤...但是我剛剛去測試了一下... ...

strcmp 在 cplusplus.com 有說明喔
...
瀏覽完整內容,請先 註冊登入會員
Melty Snow [雪靈]

使用道具檢舉

Rank: 2Rank: 2

帖子
475
積分
967 點
潛水值
31439 米
發表於 2018-7-5 09:31 AM|顯示全部樓層
snowflying 發表於 2018-7-5 03:12 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

strcmp 在 cplusplus.com 有說明喔
return value 那邊
  1. #include<iostream>
  2. #include<windows.h>
  3. #include<string>
  4. using namespace std;

  5. const int max_count = 5;
  6. string str[max_count];
  7. //隨意填值...反正是測試
  8. void set_data()
  9. {
  10.         str[0] = (char)1;
  11.         str[1] = "ABCD";
  12.         str[2] = "~~~~~~~~~~~~~";
  13.         str[3] = "ABCD";
  14.         str[4] = (char)255;
  15. }
  16. void logic()
  17. {
  18.         bool c1 = false;
  19.         for (int i = 0, ii = 0; i < max_count; i++)
  20.         {
  21.                 for (int j = i + 1; j < max_count; j++, ii++)
  22.                 {
  23.                         int ans = strcmp(str[i].c_str(), str[j].c_str());
  24.                         if (ans == 0)//代表相同
  25.                         {
  26.                                 c1 = true;
  27.                                 //cout << "index = " << i << " 的 " << str[i] << " 和 " << "index = " << j << " 的 " << str[j] << " 是一樣的\n";
  28.                                 //break;//若是抓到一樣就中斷的話....
  29.                         }
  30.                         cout << "前比較字串index = " << i << "\t" << str[i] << "\t後比較字串index = " << j << "\t" << str[j] << "\t結果 = " << ans << "\n";
  31.                 }
  32.         }
  33.         if (c1)//有字串是一樣的
  34.         {
  35.                 //動作
  36.         }
  37. }
  38. void main()
  39. {
  40.         set_data();
  41.         logic();
  42.         system("pause");
  43. }
複製代碼
以下是執行結果
重點是index = 0 and 2 and 4
  1. 前比較字串index = 0            後比較字串index = 1     ABCD    結果 = -1
  2. 前比較字串index = 0            後比較字串index = 2     ~~~~~~~~~~~~~   結果 = -1
  3. 前比較字串index = 0            後比較字串index = 3     ABCD    結果 = -1
  4. 前比較字串index = 0            後比較字串index = 4           結果 = -1
  5. 前比較字串index = 1     ABCD    後比較字串index = 2     ~~~~~~~~~~~~~   結果 = -1
  6. 前比較字串index = 1     ABCD    後比較字串index = 3     ABCD    結果 = 0
  7. 前比較字串index = 1     ABCD    後比較字串index = 4           結果 = -1
  8. 前比較字串index = 2     ~~~~~~~~~~~~~   後比較字串index = 3     ABCD    結果 = 1
  9. 前比較字串index = 2     ~~~~~~~~~~~~~   後比較字串index = 4           結果 = -1
  10. 前比較字串index = 3     ABCD    後比較字串index = 4           結果 = -1
  11. 請按任意鍵繼續 . . .
複製代碼
依舊是只有0 1 -1 三種結果...生不出其他結果
為此...我還特地去翻閱我撰寫的其他單晶片程式...不同總類的也就只有3種...我知道不多orz...更甚至linux下的C++...執行亦是如此
當然,我知道糾結這節點很沒意思,而且msdn也是如大眾說明說的的0,>0,<0,反正判斷是否相等就用回傳值是否==0罷了...只是就結果論...我是真的看不到0 1 -1 以外的回傳值就是...
瀏覽完整內容,請先 註冊登入會員

點評

baepi jackyo04 大大已經成功打我臉...BCB測出結果已經有非0 1 -1 以外的字串orz  發表於 2018-7-5 09:47 AM

使用道具檢舉

Rank: 2Rank: 2

帖子
543
積分
587 點
潛水值
10540 米
發表於 2018-7-5 10:00 AM|顯示全部樓層
本帖最後由 jackyo04 於 2018-7-5 10:03 AM 編輯
baepi 發表於 2018-7-5 09:31 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

以下是執行結果
重點是index = 0 and 2 and 4依舊是只有0 1 -1 三種結果...生不出其他結果
為此...我還特 ...
...
瀏覽完整內容,請先 註冊登入會員

點評

jackyo04 baepi大大說:不能用bool型態紀錄...因為0跟-1都算false.. 我以為我觀念錯了,當下沒想那麼多,就去做實驗了XD  發表於 2018-7-5 10:34 AM
cockroachrun c/c++ 本來就是非0 為true , 0 為false 所以 1 -1 都是true , 只有 0 是false  發表於 2018-7-5 10:13 AM
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。

使用道具檢舉

  尊貴會員

Melty Snow  雪靈

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
3222
積分
24364 點
潛水值
76910 米
發表於 2018-7-5 10:03 AM|顯示全部樓層
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。
baepi 發表於 2018-7-5 09:31 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

以下是執行結果
重點是index = 0 and 2 and 4依舊是只有0 1 -1 三種結果...生不出其他結果
為此...我還特 ...

我用 Dev-C++ 5.11 跑起來也是 0 -1 1 三種
...
瀏覽完整內容,請先 註冊登入會員
Melty Snow [雪靈]
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。

使用道具檢舉

  尊貴會員

Melty Snow  雪靈

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

帖子
3222
積分
24364 點
潛水值
76910 米
發表於 2018-7-5 10:09 AM|顯示全部樓層
如果你忘記伊莉的密碼,請在登入時按右邊出現的 '找回密碼'。輸入相關資料後送出,系統就會把密碼寄到你的E-Mail。
jackyo04 發表於 2018-7-5 10:00 AM
下載: 訪客無法瀏覽下載點,請先 註冊登入會員

其實我也挺糾結的XD
我用bool來判斷,實驗很多組字串,但它回傳的結果我很意外,目前確定的是,相同為0, ...

非零值是 true 呀
...
瀏覽完整內容,請先 註冊登入會員





Melty Snow [雪靈]
分享使你變得更實在,可以使其他人感到快樂,分享是我們的動力。今天就來分享你的資訊、圖片或檔案吧。

使用道具檢舉

您需要登錄後才可以回帖 登錄 | 註冊

Powered by Discuz!

© Comsenz Inc.

重要聲明:本討論區是以即時上載留言的方式運作,對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者發現有留言出現問題,請聯絡我們。有權刪除任何留言及拒絕任何人士上載留言,同時亦有不刪除留言的權利。切勿上傳和撰寫 侵犯版權(未經授權)、粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。
回頂部