文本内容处理的问题,请教!

文本内容处理的问题,请教! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiBase/html/delphi_20061205001316290.html
我有一个asp的文本文件,要从里面读取一部分内容,格式是固定的  
   
  279行   <a   href="detailInter~classid~1~userID~195005.asp"   target="_blank"   style="font-size:   12px;   font-family:   Verdana;color:   #333333"><strong>SICA</strong></a><br>  
  这行要读取     userID~后到.asp前的     ID号   195005  
   
  283行   <td   height="7"><span   class="companyDepot-01">MANZANA   9,   GALPON   51,   ZOFRI,   IQUIQUE</span></td>  
  这行要读取   <span   class="companyDepot-01"></span>之间的内容MANZANA   9,   GALPON   51,   ZOFRI,   IQUIQUE  
   
  286行   <td><div   align="center"   class="companyDepot-02">Mr.   FRANCISCO   LEE   W.</div></td>  
  这行要读取<div   align="center"   class="companyDepot-02"></dev>之间的内容Mr.   FRANCISCO   LEE   W.  
   
  287   <td><div   align="center"   class="companyDepot-03">ACHIAG@ACHIAG.TIE.CL</div></td>  
  这行要读取<div   align="center"   class="companyDepot-03"></dev>之间的邮址ACHIAG@ACHIAG.TIE.CL  
   
  请问如何处理啊?

if   +字串处理..

能具体一点吗   :)

帮你写一个,其他的自己照样子做吧!  
  var  
          TmpStr   :   String;  
          Start,   End   :   Integer;  
   
          ID   :   String;  
  begin  
          TmpStr   :=   '<a   href="detailInter~classid~1~userID~195005.asp"   target="_blank"   style="font-size:   12px;   font-family:   Verdana;color:   #333333"><strong>SICA</strong></a><br/>';  
           
          Start   :=   Pos   (   TmpStr,   'userID~'   );  
          End       :=   Pos   (   TmpStr,   '.asp'         );  
   
          if   (   Start   >   0   )   and   (   End   >   0   )   then  
                  ID   :=   Copy   (   TmpStr,   Start   +   7,   End   -   Start   );  
   
          .....  
  end;

呵呵,我也帮你写了一个函数,你试一下:  
  function   TForm1.SearchInAsp(AspFileName,StartSunStr,FinishSubStr:string):string;  
  var  
        AspFile:TextFile;  
        TempStr,TempStr2:String;  
  begin  
        result:='';  
        assignfile(aspfile,AspFileName);  
        reset(aspfile);  
        while   not   eof(aspfile)   do  
              begin  
              readln(aspfile,TempStr);  
              if   pos(StartSunStr,TempStr)>0   then  
                    begin  
                    while   (pos(FinishSubStr,TempStr)<1)   and   (not   eof(aspfile))   do  
                                begin  
                                readln(aspfile,TempStr2);  
                                TempStr:=TempStr+TempStr2;  
                                end;  
                    Result:=copy(TempStr,pos(StartSunStr,TempStr)+length(StartSunStr),pos(FinishSubStr,TempStr)-pos(StartSunStr,TempStr)-length(StartSunStr));  
                    end;  
              if   Result<>''   then   break;  
              end;  
        closefile(aspfile);  
  end;  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
        edit1.Text:=self.SearchInAsp('c:\a.asp','userID~','.asp');  
  end;  
  //注意,在*.asp的html代码里,极可能出现<span>.....</span>等写在多行的情况(本函数已作这种处理)。也极可能出现行首有空格等情况(本函数未处理)。所以,实际应用中,你要考虑各种异常,再改进。

谢谢,这里好人真多,谢谢各位啊     :)

转载于:https://www.cnblogs.com/delphi2007/archive/2009/04/22/1441138.html

<think> 我们正在讨论C语言宏的相关知识。用户已经明确要求获取宏的使用教程和相关知识,并且之前已经提供了一些精选资料。现在需要根据用户当前的请求,结合之前提供的引用内容,系统地讲解C语言宏的知识。 首先,回顾用户提供的引用内容: - 引用[1]提到了内联函数作为宏函数的替代方案,并给出了一个例子。 - 引用[2]介绍了预处理命令(以#开头)和基本数据类型。 - 引用[3]讨论了extern修饰全局变量的作用域扩展。 但用户当前的需求是获取宏的相关知识,因此重点应放在宏上。我们将从以下几个方面展开: 1. 宏的基本概念和定义方式 2. 宏的常见用法(包括带参数的宏、特殊运算符#和##) 3. 宏的优缺点及注意事项(如副作用、括号的重要性) 4. 宏与内联函数、const常量的比较 5. 宏在预处理阶段的处理机制 同时,需要遵循用户要求的格式: - 数学表达式使用$...$(行内)或$$...$$(独立) - 使用中文回答 - 生成相关问题 - 在引用段落末尾添加引用标识 接下来,结构化回答: ### C语言宏的使用教程和相关知识 #### 1. 宏的基本概念 宏是C语言预处理器提供的一种功能,用于在编译前对源代码进行文本替换。它以`#define`指令定义,分为两种类型: - **无参数宏**:用于定义常量或简单替换 ```c #define PI 3.14159 #define BUFFER_SIZE 1024 ``` - **带参数宏**:类似函数,可接受参数 ```c #define MAX(a, b) ((a) > (b) ? (a) : (b)) ``` #### 2. 宏的特殊运算符 - **`#`运算符(字符串化)**:将宏参数转换为字符串字面量 ```c #define STR(x) #x printf("%s", STR(hello)); // 输出"hello" ``` - **`##`运算符(连接)**:连接两个标记形成新标识符 ```c #define CONCAT(a, b) a##b int var12 = CONCAT(var, 12); // 等效于 int var12; ``` #### 3. 宏的注意事项 - **副作用问题**:宏的参数可能被多次求值,导致意外行为 ```c #define SQUARE(x) ((x) * (x)) int a = 2; int b = SQUARE(a++); // 展开为 ((a++) * (a++)),a被增加两次 ``` 解决方案:避免在宏参数中使用自增/自减操作[^1]。 - **括号必要性**:为确保运算顺序正确,需为每个参数和整个表达式加括号 ```c // 错误示例:不加括号可能改变优先级 #define SUM(a, b) a + b int c = SUM(2, 3) * 5; // 展开为 2 + 3 * 5 = 17(而非25) // 正确写法 #define SUM(a, b) ((a) + (b)) ``` #### 4. 宏与替代方案的比较 | **特性** | **宏** | **inline函数** | **const常量** | |------------------|--------------------------------|------------------------------|----------------------| | **处理阶段** | 预处理期(文本替换) | 编译期(生成机器码) | 编译期(分配内存) | | **类型检查** | 无(可能引发类型错误) | 有(安全性高) | 有(安全性高) | | **调试难度** | 难(无法单步调试展开内容) | 易(视为普通函数) | 易(视为常量) | | **性能影响** | 无函数调用开销(但可能增大代码) | 无函数调用开销(编译器决定展开) | 无运行时开销 | #### 5. 预处理阶段验证 使用`gcc -E`命令可查看宏展开后的代码: ```bash gcc -E test.c -o test.i ``` #### 6. 工程实践建议 - 宏名称全部大写,以下划线分隔(如`DEBUG_MODE`)[^2] - 复杂逻辑优先使用`inline`函数替代宏[^1] - 利用宏实现跨平台条件编译: ```c #ifdef __linux__ // Linux专用代码 #elif _WIN32 // Windows专用代码 #endif ``` §§相关问题§§ 1. 如何避免宏函数因参数副作用导致的逻辑错误? 2. `#` 和 `##` 运算符在嵌入式开发中有哪些具体应用? 3. 宏定义与 `const` 常量/`inline` 函数的性能差异如何分析? 4. 宏在跨平台开发中如何发挥作用? [^1]: 内联函数替代宏函数示例参考 [^2]: 宏命名规范及预处理命令基础 </think> ### C语言宏的使用教程和相关知识 #### 一、宏的基本概念 宏是C语言预处理器指令,以`#define`开头,在编译前进行文本替换。分为两类: 1. **无参数宏** 用于常量定义:`#define PI 3.14159` 替换规则:代码中所有`PI`会被替换为`3.14159`[^2] 2. **带参数宏** 类似函数:`#define MAX(a,b) ((a)>(b)?(a):(b))` 注意:每个参数和整个表达式需加括号,避免优先级错误 #### 二、核心语法详解 1. **字符串化运算符 `#`** 将参数转为字符串: ```c #define STR(x) #x printf(STR(Hello)); // 输出 "Hello" ``` 2. **连接运算符 `##`** 拼接标识符: ```c #define VAR(n) var##n int VAR(1) = 10; // 等效于 int var1 = 10; ``` 3. **预定义宏** | 宏 | 作用 | |--------------|-----------------------| | `__LINE__` | 当前行号 | | `__FILE__` | 当前文件名 | | `__DATE__` | 编译日期(MMM DD YYYY) | | `__TIME__` | 编译时间(HH:MM:SS) | #### 三、宏的典型应用场景 1. **条件编译** ```c #ifdef DEBUG printf("Debug mode: x=%d\n", x); // 调试时输出 #endif ``` 2. **跨平台适配** ```c #if defined(_WIN32) // Windows专用代码 #elif defined(__linux__) // Linux专用代码 #endif ``` 3. **避免重复包含** ```c #ifndef MY_HEADER_H #define MY_HEADER_H // 头文件内容 #endif ``` #### 四、宏的致命陷阱与规避方案 1. **参数副作用** 错误示例: ```c #define SQUARE(x) (x)*(x) int a = 2; int b = SQUARE(a++); // 展开为 (a++)*(a++),结果不可预测 ``` **解决方案**: - 避免在宏参数中使用自增/自减 - 改用内联函数:`inline int square(int x) { return x*x; }`[^1] 2. **缺少括号导致的优先级错误** 错误示例: ```c #define SUM(a,b) a+b int c = SUM(2,3)*5; // 展开为 2+3*5 = 17(非期望的25) ``` **正确写法**: ```c #define SUM(a,b) ((a)+(b)) // 双层括号确保优先级 ``` #### 五、宏 vs 替代方案对比 | 特性 | 宏 | `inline`函数[^1] | `const`常量[^2] | |--------------|------------------------|----------------------|-------------------| | **处理阶段** | 预处理期(文本替换) | 编译期 | 编译期 | | **类型检查** | 无 | 有 | 有 | | **调试难度** | 难(无法单步调试) | 易(普通函数) | 易(常量值) | | **适用场景** | 条件编译/代码生成 | 简单逻辑复用 | 数学常量 | #### 六、工程最佳实践 1. **命名规范**:全大写+下划线(如`BUFFER_SIZE`) 2. **作用域控制**:用`#undef`及时取消定义 ```c #define TEMP_MACRO // ... #undef TEMP_MACRO // 避免污染后续代码 ``` 3. **调试技巧**: - 使用`gcc -E source.c`查看预处理结果 - 日志宏示例: ```c #define LOG(msg) printf("[%s:%d] %s\n", __FILE__, __LINE__, msg) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值