g****y 发帖数: 436 | 1 这两天在改一个用C写的处理文件IO和字符串的程序,遇到众多令人头疼的问题,靠着
google和自己的一些想法勉强解决了,但是效率不高,想请教一下这里的大侠:
1。从文件中读取一行,例如:
SR01.01 02 G\t-\t9908\t#@#@$@@#@#@@
现在想得到SR01.01 02 G, -, 9908这三个字符串。
首先想到用scanf("%s%s%s%*s",s1,s2,s3);
但是不工作,因为SR01.01 02 G中间有两个空格。
放狗发现了一个bstrlib.h,里面有一个bsplit,可以使用\t作为delimiter。但是太麻
烦了,所以自己写了一个getTokens。
后来发现c++ programming how to里面有一个写得很好的string类,但是我怕用了以后
导致原来的代码编译出错,所以没敢用。
2。检查子字符串,比如java有一个String.startsWith(),发现C也没有。也只好自己
写了一个。就是用一个循环比较两个字符串。不知道有没有更好的办法。
最后文一下C/C++混合代码的问题,比如
/* mix.c*/
printf("c s | b****j 发帖数: 78 | 2 1. strtok
2. strncmp
【在 g****y 的大作中提到】 : 这两天在改一个用C写的处理文件IO和字符串的程序,遇到众多令人头疼的问题,靠着 : google和自己的一些想法勉强解决了,但是效率不高,想请教一下这里的大侠: : 1。从文件中读取一行,例如: : SR01.01 02 G\t-\t9908\t#@#@$@@#@#@@ : 现在想得到SR01.01 02 G, -, 9908这三个字符串。 : 首先想到用scanf("%s%s%s%*s",s1,s2,s3); : 但是不工作,因为SR01.01 02 G中间有两个空格。 : 放狗发现了一个bstrlib.h,里面有一个bsplit,可以使用\t作为delimiter。但是太麻 : 烦了,所以自己写了一个getTokens。 : 后来发现c++ programming how to里面有一个写得很好的string类,但是我怕用了以后
| c*****t 发帖数: 1879 | 3 avoid using strtok at all costs. strchr is a better alternative.
scanf technically can scan with delimiter, but usually it is
faster to scan the whole line, then use strchr.
【在 b****j 的大作中提到】 : 1. strtok : 2. strncmp
| D*******a 发帖数: 3688 | 4 这么麻烦为什么不用regex
【在 g****y 的大作中提到】 : 这两天在改一个用C写的处理文件IO和字符串的程序,遇到众多令人头疼的问题,靠着 : google和自己的一些想法勉强解决了,但是效率不高,想请教一下这里的大侠: : 1。从文件中读取一行,例如: : SR01.01 02 G\t-\t9908\t#@#@$@@#@#@@ : 现在想得到SR01.01 02 G, -, 9908这三个字符串。 : 首先想到用scanf("%s%s%s%*s",s1,s2,s3); : 但是不工作,因为SR01.01 02 G中间有两个空格。 : 放狗发现了一个bstrlib.h,里面有一个bsplit,可以使用\t作为delimiter。但是太麻 : 烦了,所以自己写了一个getTokens。 : 后来发现c++ programming how to里面有一个写得很好的string类,但是我怕用了以后
| g****y 发帖数: 436 | 5 谢谢,刚才看了一下,regex貌似不是standard C library里面的,windows下面能
compile吗?
【在 D*******a 的大作中提到】 : 这么麻烦为什么不用regex
| c*****t 发帖数: 1879 | 6 regex is NOT going to be any easier. It will be a lot slower because
it has to construct NFA as run time.
scanf actually supports a very limited form of regex which can be
efficiently used to match input. Its regex is slightly different
from POSIX, but for most uses, about the same.
If you can master scanf, string functions (strchr, strstr, strcmp etc),
there will be rarely a need to use anything else. More complicated
stuff usually flex.
regex is for people who has no idea. It is really not
【在 g****y 的大作中提到】 : 谢谢,刚才看了一下,regex貌似不是standard C library里面的,windows下面能 : compile吗?
| g****y 发帖数: 436 | 7 多谢大侠指点!能不能推荐一下scanf的一些用法的website或者book?我搜了半天也找
不到怎么用自定义delimiter的内容。
【在 c*****t 的大作中提到】 : regex is NOT going to be any easier. It will be a lot slower because : it has to construct NFA as run time. : scanf actually supports a very limited form of regex which can be : efficiently used to match input. Its regex is slightly different : from POSIX, but for most uses, about the same. : If you can master scanf, string functions (strchr, strstr, strcmp etc), : there will be rarely a need to use anything else. More complicated : stuff usually flex. : regex is for people who has no idea. It is really not
| g****y 发帖数: 436 | 8 另外下午测试了一下,用strchr代码上干净很多,但是速度貌似和我的
token【k++】 = str【j++】差不多啊,用了一个有1.5million行text的测试数据文件。
【在 c*****t 的大作中提到】 : regex is NOT going to be any easier. It will be a lot slower because : it has to construct NFA as run time. : scanf actually supports a very limited form of regex which can be : efficiently used to match input. Its regex is slightly different : from POSIX, but for most uses, about the same. : If you can master scanf, string functions (strchr, strstr, strcmp etc), : there will be rarely a need to use anything else. More complicated : stuff usually flex. : regex is for people who has no idea. It is really not
| b****j 发帖数: 78 | 9 man scanf
scanf("%[^\t]%*c%[^\t]%*c%[^\t]", s1, s2, s3);
【在 g****y 的大作中提到】 : 多谢大侠指点!能不能推荐一下scanf的一些用法的website或者book?我搜了半天也找 : 不到怎么用自定义delimiter的内容。
| g****y 发帖数: 436 | 10 甚强巨!完全实现了所要的功能!
【在 b****j 的大作中提到】 : man scanf : scanf("%[^\t]%*c%[^\t]%*c%[^\t]", s1, s2, s3);
| D*******a 发帖数: 3688 | 11 彻头彻尾地被鄙视了
【在 c*****t 的大作中提到】 : regex is NOT going to be any easier. It will be a lot slower because : it has to construct NFA as run time. : scanf actually supports a very limited form of regex which can be : efficiently used to match input. Its regex is slightly different : from POSIX, but for most uses, about the same. : If you can master scanf, string functions (strchr, strstr, strcmp etc), : there will be rarely a need to use anything else. More complicated : stuff usually flex. : regex is for people who has no idea. It is really not
|
|