search_n

 
// search_n.cpp -- 2011-10-01-23.52
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>

using std ::vector ;
using std ::equal_to ;

int _tmain(int argc, _TCHAR* argv[])
{
	int arr1[] = {1, 1, 2, 3, 4, 5, 7, 8, 9} ;
	vector<int> vec1(arr1, arr1 + sizeof arr1 / sizeof (int)) ;

	//	search_n (beg, end, count, val) ;
	//	操作前:[beg,end)是输入序列.val是要查找序列中的元素值.count是序列中元素的个数.
	//	操作后:确定[beg,end)序列中是否存在count个val值的子序列.
	//	返回值:如果[beg,end)序列中存在这个子序列,返回指向第一次出现位置的迭代器.
	//					否则返回end.
	//	备注:		无.
	vector<int> ::iterator iter = search_n(vec1.begin(), vec1.end(), 1, 1) ;
	if (iter != vec1.end())
		std ::cout << *iter << std ::endl ;

	//	search_n (beg, end, count, val, equal_to<int> ()) ;
	//	操作前:[beg,end)是输入序列.val是要查找序列中的元素值.count是序列中元素的个数.equal_to<int> ()是二元函数对象.
	//	操作后:确定[beg,end)序列中是否存在count个val值的子序列.
	//	返回值:如果[beg,end)序列中存在这个子序列,返回指向第一次出现位置的迭代器.
	//					否则返回end.
	//	备注:		相等元素是使equal<int> ()为真的元素.
	iter = search_n(vec1.begin(), vec1.end(), 2, 1, equal_to<int> ()) ;
	if (iter != vec1.end())
		std ::cout << *iter << std ::endl ;

	std ::cin.get() ;

	return 0 ;
}
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include "aip_common.h" #include <string.h> #include <stdlib.h> #define ZERO (0) #define FALSE (0) #define WRONG (1) #define SUCCESS (0) #define TRUE (1) #define ENDOFSTRING (8) #define STORESIZE (9) #define HEX (16) #define MAX_LINE_LENGTH (256) #define ADD_VALUE (0xF) #define MAX_SEARCH_STR (20) U1 u1_s_search_line(S1* s1p_ap_search_line, FILE* stp_a_creatfile_write, U4* u4p_a_search_target, const S1* search_str); U1 u1_s_openfile(FILE* stp_a_openfile_target); U1 u1_s_creatfile(FILE* stp_a_creatfile_target); void vd_s_delet(s4_a_search_linelength, s1_ap_search_str); void vd_s_initialize_array(U1* u1p_a_array_start, U4 u4_a_array_size, U1 u1_a_arr_value); U4 main(void) { FILE* stp_t_creatfile_read; FILE* stp_t_creatfile_write; S1 s1_tp_search_line[MAX_LINE_LENGTH]; S1 s1_tp_search_str[MAX_SEARCH_STR]; S4 s4_t_search_linelength; U4 u4_t_search_target; U4 u4_t_file_state; U1 u1_t_input_state; S4 s4_tp_store_string[STORESIZE]; u4_t_search_target = (U4)FALSE; stp_t_creatfile_read = fopen("DA_510B_IMG_1.mhx", "rb"); stp_t_creatfile_write = fopen("WRITE_ADDRESS.TXT", "w"); u1_s_openfile(stp_t_creatfile_read); u1_s_creatfile(stp_t_creatfile_write); vd_s_initialize_array((U1*)s4_tp_store_string, STORESIZE, (U1)ZERO); printf("请输入要查询的字符串: "); u1_t_input_state = fgets(s1_tp_search_str, sizeof(s1_tp_search_str), stdin); if (u1_t_input_state == NULL) { printf("读取输入失败\n"); fclose(stp_t_creatfile_read); fclose(stp_t_creatfile_write); system("pause"); u4_t_file_state = WRONG; } else { s4_t_search_linelength = strlen(s1_tp_search_str); vd_s_delet(s4_t_search_linelength, s1_tp_search_str); printf("输入文件打开成功\n"); printf("正在查询字符串: %s\n", s1_tp_search_str); while (fgets(s1_tp_search_line, MAX_LINE_LENGTH, stp_t_creatfile_read)) { s4_t_search_linelength = strlen(s1_tp_search_line); vd_s_delet(s4_t_search_linelength, s1_tp_search_line); if (u1_s_search_line(s1_tp_search_line, stp_t_creatfile_write, &u4_t_search_target, s1_tp_search_str)) { break; } } if (!u4_t_search_target) { printf("未找到包含'%s'的行\n", s1_tp_search_str); fprintf(stp_t_creatfile_write, "0x40000000,0x00000000\n"); fprintf(stp_t_creatfile_write, "0x43FFFFF0,0x43FFFFFF\n"); printf("已写入默认格式到文件\n"); } u4_t_file_state = SUCCESS; } fclose(stp_t_creatfile_read); fclose(stp_t_creatfile_write); system("pause"); return (U4)u4_t_file_state; } U1 u1_s_search_line(S1* s1p_ap_search_line, FILE* stp_a_creatfile_write, U4* u4p_a_search_target, const S1* s1p_ap_search_target) { U1* u1p_t_search_target; U1* u1p_t_search_startofline; unsigned long u4_t_search_oldaddress; unsigned long u4_t_search_newaddress; U1 u1_t_search_hexaddress[STORESIZE]; char s4_tp_store_string[STORESIZE]; U1 u1_t_serach_result; vd_s_initialize_array((U1*)s4_tp_store_string, STORESIZE, (U1)ZERO); u1p_t_search_target = strstr(s1p_ap_search_line, s1p_ap_search_target); if (u1p_t_search_target != NULL) { printf("找到目标行: %s\n", s1p_ap_search_line); u1p_t_search_startofline = u1p_t_search_target + strlen(s1p_ap_search_target); strncpy(s4_tp_store_string, u1p_t_search_startofline, (U4)ENDOFSTRING); s4_tp_store_string[(U4)ENDOFSTRING] = '\0'; printf("原始十六进制地址: %s\n", s4_tp_store_string); u4_t_search_oldaddress = strtoul(s4_tp_store_string, NULL, (U4)HEX); u4_t_search_newaddress = u4_t_search_oldaddress + ADD_VALUE; snprintf(u1_t_search_hexaddress, sizeof(u1_t_search_hexaddress), "%08lX", u4_t_search_newaddress); printf("加16后的地址: 0x%s\n", u1_t_search_hexaddress); fprintf(stp_a_creatfile_write, "0x40000000,0x%s\n", u1_t_search_hexaddress); fprintf(stp_a_creatfile_write, "0x43FFFFF0,0x43FFFFFF\n"); printf("已成功写入文件: WRITE_ADDRESS.TXT\n"); *u4p_a_search_target = (U4)TRUE; u1_t_serach_result = TRUE; } else { u1_t_serach_result = 0; } return u1_t_serach_result; } U1 u1_s_openfile(FILE* stp_a_openfile_target) { if (NULL == stp_a_openfile_target) { printf("输入文件打开失败\n"); system("pause"); return (U4)WRONG; } } U1 u1_s_creatfile(FILE* stp_a_creatfile_target) { if (NULL == stp_a_creatfile_target) { printf("输出文件创建失败\n"); fclose(stp_a_creatfile_target); system("pause"); return (U4)WRONG; } } void vd_s_delet(S4 s4_a_search_linelength, char* s1_ap_search_str) { if (s4_a_search_linelength > 0 && s1_ap_search_str[s4_a_search_linelength - 1] == '\n') { s1_ap_search_str[s4_a_search_linelength - 1] = '\0'; } } void vd_s_initialize_array(U1* u1p_a_array_start, U4 u4_a_array_size, U1 u1_a_arr_value) { U4 u4_t_arrryinit_loop; for (u4_t_arrryinit_loop = 0; u4_t_arrryinit_loop < u4_a_array_size; u4_t_arrryinit_loop++) { u1p_a_array_start[u4_t_arrryinit_loop] = u1_a_arr_value; } } 如果要求while()中不能有函数,while (fgets(s1_tp_search_line, MAX_LINE_LENGTH, stp_t_creatfile_read))该怎么修改
08-01
<think>我们要求while循环条件中不能有函数调用,那么需要将fgets的调用移到循环条件之外,同时保持循环能够逐行读取文件直到结束。 我们可以使用一个无限循环,然后在循环体内调用fgets,并根据fgets的返回值判断是否继续循环。 修改思路: 1. 在while循环之前,先读取第一行。 2. 将循环条件改为检查读取的行是否不为NULL(即成功读取)。 3. 在循环体的末尾再次调用fgets读取下一行。 注意:在循环体内,处理完当前行后,需要读取下一行,否则会死循环。 具体修改步骤: 原代码: while (fgets(s1_tp_search_line, MAX_LINE_LENGTH, stp_t_creatfile_read)) { ... // 处理当前行 } 修改为: char *fgets_result = fgets(s1_tp_search_line, MAX_LINE_LENGTH, stp_t_creatfile_read); while (fgets_result != NULL) { ... // 处理当前行(包括移除换行符和调用u1_s_search_line) // 读取下一行 fgets_result = fgets(s1_tp_search_line, MAX_LINE_LENGTH, stp_t_creatfile_read); } 但是注意:在循环体内,如果找到了目标行并break跳出,那么就不会再读取下一行,这样不会导致问题,因为break会跳出循环。 因此,修改后的代码结构如下: // 读取第一行 char *fgets_result = fgets(s1_tp_search_line, MAX_LINE_LENGTH, stp_t_creatfile_read); while (fgets_result != NULL) { s4_t_search_linelength = strlen(s1_tp_search_line); vd_s_delet(s4_t_search_linelength, s1_tp_search_line); if (u1_s_search_line(s1_tp_search_line, stp_t_creatfile_write, &u4_t_search_target, s1_tp_search_str)) { break; } // 读取下一行 fgets_result = fgets(s1_tp_search_line, MAX_LINE_LENGTH, stp_t_creatfile_read); } 这样修改后,while循环条件中不再有函数调用,而是使用一个变量。 但是,注意这样修改后,循环体内有两处调用fgets(一处是循环开始前,一处是循环末尾),并且循环条件检查的是第一次读取的结果。 另外,注意在循环体内,当处理完一行后,如果未找到目标,则继续读取下一行,直到文件结束或找到目标。 这种修改不会改变原有逻辑,只是将fgets从循环条件移到了循环体内。 但是,我们也可以使用一个do-while循环,但考虑到可能第一行就满足条件,所以使用上述方式。 注意:在循环体内,如果当前行处理中找到了目标,则break跳出,此时不会执行循环体末尾的fgets,因此不会覆盖当前行(因为已经处理完了,所以没关系)。 修改后的代码需要将fgets_result定义为char*类型,并替换原来的u1p_t_fgetsresult(原代码中已经删除了这个变量,所以直接定义一个新的)。 在main函数中,我们需要声明一个char*变量来存储fgets的返回值。 具体修改如下:</think>### 修改方案:移除 `while` 条件中的函数调用 ```c #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include "aip_common.h" #include <string.h> #include <stdlib.h> #define ZERO (0) #define FALSE (0) #define WRONG (1) #define SUCCESS (0) #define TRUE (1) #define ENDOFSTRING (8) #define STORESIZE (9) #define HEX (16) #define MAX_LINE_LENGTH (256) #define ADD_VALUE (0xF) #define MAX_SEARCH_STR (20) U1 u1_s_search_line(S1* s1p_ap_search_line, FILE* stp_a_creatfile_write, U4* u4p_a_search_target, const S1* s1p_ap_search_target); U1 u1_s_openfile(FILE* stp_a_openfile_target); U1 u1_s_creatfile(FILE* stp_a_creatfile_target); void vd_s_delet(S4 s4_a_search_linelength, char* s1_ap_search_str); void vd_s_initialize_array(U1* u1p_a_array_start, U4 u4_a_array_size, U1 u1_a_arr_value); U4 main(void) { FILE* stp_t_creatfile_read; FILE* stp_t_creatfile_write; S1 s1_tp_search_line[MAX_LINE_LENGTH]; S1 s1_tp_search_str[MAX_SEARCH_STR]; S4 s4_t_search_linelength; U4 u4_t_search_target; U4 u4_t_file_state; U1 u1_t_input_state; S4 s4_tp_store_string[STORESIZE]; U1 u1_t_continue = TRUE; // 新增循环控制标志 u4_t_search_target = (U4)FALSE; stp_t_creatfile_read = fopen("DA_510B_IMG_1.mhx", "rb"); stp_t_creatfile_write = fopen("WRITE_ADDRESS.TXT", "w"); u1_s_openfile(stp_t_creatfile_read); u1_s_creatfile(stp_t_creatfile_write); vd_s_initialize_array((U1*)s4_tp_store_string, STORESIZE, (U1)ZERO); printf("请输入要查询的字符串: "); u1_t_input_state = fgets(s1_tp_search_str, sizeof(s1_tp_search_str), stdin); if (u1_t_input_state == NULL) { printf("读取输入失败\n"); fclose(stp_t_creatfile_read); fclose(stp_t_creatfile_write); system("pause"); u4_t_file_state = WRONG; } else { s4_t_search_linelength = strlen(s1_tp_search_str); vd_s_delet(s4_t_search_linelength, s1_tp_search_str); printf("输入文件打开成功\n"); printf("正在查询字符串: %s\n", s1_tp_search_str); // 修改后的循环结构 while (u1_t_continue) // 使用标志控制循环 { if (fgets(s1_tp_search_line, MAX_LINE_LENGTH, stp_t_creatfile_read) == NULL) { u1_t_continue = FALSE; // 文件结束则退出循环 } else { s4_t_search_linelength = strlen(s1_tp_search_line); vd_s_delet(s4_t_search_linelength, s1_tp_search_line); if (u1_s_search_line(s1_tp_search_line, stp_t_creatfile_write, &u4_t_search_target, s1_tp_search_str)) { u1_t_continue = FALSE; // 找到目标则退出循环 } } } if (!u4_t_search_target) { printf("未找到包含'%s'的行\n", s1_tp_search_str); fprintf(stp_t_creatfile_write, "0x40000000,0x00000000\n"); fprintf(stp_t_creatfile_write, "0x43FFFFF0,0x43FFFFFF\n"); printf("已写入默认格式到文件\n"); } u4_t_file_state = SUCCESS; } fclose(stp_t_creatfile_read); fclose(stp_t_creatfile_write); system("pause"); return (U4)u4_t_file_state; } // 其余函数保持原样不变 U1 u1_s_search_line(S1* s1p_ap_search_line, FILE* stp_a_creatfile_write, U4* u4p_a_search_target, const S1* s1p_ap_search_target) { /* 函数实现保持不变 */ } U1 u1_s_openfile(FILE* stp_a_openfile_target) { /* 函数实现保持不变 */ } U1 u1_s_creatfile(FILE* stp_a_creatfile_target) { /* 函数实现保持不变 */ } void vd_s_delet(S4 s4_a_search_linelength, char* s1_ap_search_str) { /* 函数实现保持不变 */ } void vd_s_initialize_array(U1* u1p_a_array_start, U4 u4_a_array_size, U1 u1_a_arr_value) { /* 函数实现保持不变 */ } ``` ### 主要修改说明: 1. **添加循环控制标志**: - 新增 `u1_t_continue` 布尔变量控制循环 - 初始值设为 `TRUE`,确保至少执行一次循环 2. **重构循环结构**: ```c while (u1_t_continue) // 仅检查标志值 { if (fgets(...) == NULL) // 文件读取操作移到循环体内 { u1_t_continue = FALSE; // 文件结束时设置退出标志 } else { // 处理当前行 if (找到目标) { u1_t_continue = FALSE; // 找到目标时设置退出标志 } } } ``` 3. **保持原有逻辑不变**: - 文件读取、字符串处理和搜索逻辑完全保留 - 函数实现无需修改 - 错误处理和结果输出保持不变 ### 修改后的优势: 1. 完全符合要求,`while` 条件中不再包含函数调用 2. 保持原有功能不变,仍支持: - 逐行读取文件 - 搜索目标字符串 - 处理十六进制地址 - 未找到时写入默认值 3. 代码结构清晰,易于维护
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值