亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2295 | 回復(fù): 8
打印 上一主題 下一主題

字符串分析, 交流一段代碼 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2010-05-09 17:05 |只看該作者 |倒序瀏覽
大家好。

比如有現(xiàn)在這樣一串字符串

char *str = "aaa=55   bbb=0.8 ccc=14";
要分別讀出其中aaa, bbb, ccc三個參數(shù)的值, 其中bbb為double型, aaa, ccc為int
三個參數(shù)間用空格隔開。

現(xiàn)在我寫了一段代碼, 可以來分析這行字符, 并正確讀出各值 。
但是我覺得我的代碼中用的方法太差了, 感覺用這種方法太死了。

我的代碼如下
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. static int
  5. read_bookmark_line(const char *cp1, int *aaa, double *bbb, int *ccc)
  6. {
  7.         char *cp3;

  8.         cp3 = strchr(cp1, '=');
  9.         if (strncmp(cp1, "aaa", cp3 - cp1) == 0) {
  10.                 *aaa = atoi(++cp3);
  11.         }

  12.         cp1 = cp3++;
  13.         cp3 = strchr(cp1, '=');
  14.         while (*++cp1 != ' ');
  15.         while (*++cp1 == ' ');
  16.         if (strncmp(cp1, "bbb", cp3 - cp1) == 0) {
  17.                 *bbb = atof(++cp3);
  18.         }

  19.         cp1 = cp3++;
  20.         cp3 = strchr(cp1, '=');
  21.         while (*++cp1 != ' ');
  22.         while (*++cp1 == ' ');
  23.         if (strncmp(cp1, "ccc", cp3 - cp1) == 0) {
  24.                 *ccc = atoi(++cp3);
  25.         }

  26.         if (*aaa == 0)
  27.                 return 0;

  28.         return 1;
  29. }

  30. char *str = "aaa=55   bbb=0.8 ccc=14";

  31. int
  32. main(void)
  33. {
  34.         int aaa, ccc;
  35.         double bbb;

  36.         char *s = str;
  37.         read_bookmark_line(s, &aaa, &bbb, &ccc);

  38.         printf("aaa= %d, bbb = %f, ccc = %d\n",
  39.                 aaa, bbb, ccc);

  40.         return 0;
  41. }
復(fù)制代碼
感覺其中的read_bookmark_line, 被我寫的太爛了,沒有絲毫的方法性可言。
不知道大家對這段代碼怎么看?或是有什么意見。

PS:這是我在寫一個分析文件的函數(shù), 類似于分析配置文件。讀一行, 分析一行。

謝謝, 歡迎交流。

論壇徽章:
0
2 [報告]
發(fā)表于 2010-05-09 17:09 |只看該作者
分析配置 文件

我建議你用bison(lex)/yacc
這個非常的不錯

論壇徽章:
0
3 [報告]
發(fā)表于 2010-05-09 18:12 |只看該作者
這個問題需要看具體的應(yīng)用。如果需求比較固定,樓主的方法是可行的。當(dāng)然還能進一步限制語法,比如上面要求寫成,每行一個等式的方式:
aaa=55
bbb=0.8
ccc=14
這樣做起來簡單。而且可以更加限制一下語法,讓它變成:
i aaa=55
d bbb=0.8
i ccc=14
先讀出每行的開頭一個字母,然后直接利用sscanf之類的函數(shù)直接進行分析。

如果語法復(fù)雜,那么可以考慮二樓說的那些工具;蛘咦约簩W(xué)習(xí)一下編譯原理詞法語法之類相關(guān)內(nèi)容。

論壇徽章:
0
4 [報告]
發(fā)表于 2010-05-09 20:18 |只看該作者
  1. sscanf(str,"aaa=%d   bbb=%lf ccc=%d", &a, &b, &c);
復(fù)制代碼

論壇徽章:
0
5 [報告]
發(fā)表于 2010-05-09 22:57 |只看該作者
語法及詞法分析器有點殺雞用牛刀的味道了,而且多了一個預(yù)處理環(huán)節(jié)不大方便。這種小問題用正規(guī)式解決足矣。樓主#include <regex.h>然后再man regex.h慢慢學(xué)習(xí)吧。

論壇徽章:
0
6 [報告]
發(fā)表于 2010-05-10 00:03 |只看該作者
謝謝樓上幾位

發(fā)才用sscanf 來處理我的問題蠻方便的。只是這樣的話, 文件中的內(nèi)容就要事先約定好。 某些地方多一個空格都不行。

5#沒本說的這個regex.h倒是從未聽說過,長見識了。去看下。

其實分析配置文件有個dotconf蠻不錯的。 只是我這里的各參數(shù)會寫在一行。而不能分行寫。例如下面這樣的例子

....
<test>
aaa=3 bbb=5.4 ccc=2
aaa=3 bbb=5.4 ccc=2
aaa=3 bbb=5.4 ccc=2
aaa=3 bbb=5.4 ccc=2
</test>
....

所以在這個文件中我要先找到test匹配項, 再讀<test> 和 </test>之間的數(shù)行, 每一行的內(nèi)容都存于一個結(jié)構(gòu)里, 一個匹配項下面會有數(shù)量不定的結(jié)構(gòu)。
這就是我的需求。

大概實現(xiàn)方法已經(jīng)想到(一個鏈表, 讀一行后就向鏈表中插一個結(jié)構(gòu))


隔開aaa bbb ccc 參數(shù)并取相應(yīng)數(shù)據(jù), 寫代碼時發(fā)現(xiàn)自己實習(xí)方法很笨, 遂發(fā)貼交流。

謝謝各位。

論壇徽章:
1
天秤座
日期:2014-04-27 07:42:20
7 [報告]
發(fā)表于 2010-05-10 11:26 |只看該作者
如果是文字分析,顯然需要一個分析函數(shù)來處理這種問題,但你不要指望能有非常高的效率和正確率。如果是數(shù)據(jù)傳輸協(xié)議,那么事先約定就好,傳的時候不要搞錯內(nèi)容,接收后自然不會解析出錯誤的數(shù)據(jù)來

論壇徽章:
1
射手座
日期:2013-08-21 13:11:46
8 [報告]
發(fā)表于 2010-05-10 14:57 |只看該作者
StringSplit就行了哈

論壇徽章:
0
9 [報告]
發(fā)表于 2010-05-10 15:50 |只看該作者
pcre亦可
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP