user-0 提问: 求助

回复:
user: user-1
content: 引用 21 楼 amotym 的回复:只用gcc，昨晚发现（：ins后多了一个空格  改正后现在是这个情况  有进展就好，接着调试吧！ 用什么文本编辑器写代码的呢？难道是  vim ？ ～

user: user-2
content: 按照固定格式去解析，按行去判断，找到开始和结尾就行了，考虑好怎么存就行了

user: user-0
content: 引用 19 楼 拥抱Linux 的回复:[quote=引用 18 楼 amotym 的回复:] 完了，估计我的系统是假的 那不知道，俺代码里的xml文件的名字，俺顺手给改成了01.xml，你看看你的实际的xml文件的名字是啥？ 还是先把代码通读一遍吧，然后调试。你用什么IDE么？还是只用gcc和gdb？[/quote]  只用gcc，昨晚发现（：ins后多了一个空格  改正后现在是这个情况

user: user-1
content: 还有一个也忘了说了，你上面发的xml文件的内容，「(:ins」这一行的末尾有一个空格，但是代码里面的检查字符串是没有空格的，空格也是一个字符哦，你把xml文件里「(:ins」这一行的末尾的多余的空格删掉，再运行程序。 嗯，细节～

user: user-1
content: 引用 18 楼 amotym 的回复:完了，估计我的系统是假的 那不知道，俺代码里的xml文件的名字，俺顺手给改成了01.xml，你看看你的实际的xml文件的名字是啥？ 还是先把代码通读一遍吧，然后调试。你用什么IDE么？还是只用gcc和gdb？

user: user-0
content: 引用 17 楼 拥抱Linux 的回复:[quote=引用 16 楼 amotym 的回复:] 改完后依然使段错误（核心已转储） 上面最后提到的输出的循环，第一层的结束条件也改了一下， 从  i < first + 1 ; 改成了 i < first ; 忘了说了，但是上面的代码是看得到的。 还有段错误（核心已转储）的话，就把 数组长度再改小一点， 够用就行了。 俺这边运行没问题：  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(int argc, char const *argv[]) { 	FILE *fp; 	fp = fopen("01.xml", "r"); 	if (NULL == fp) { 		printf("Error! File open #1 failed!\n"); 		exit(EXIT_FAILURE); 	}  	/*遍历01.xml，得到所需数据的行数，即字符数组数*/ 	char instr_start[20] = "(:ins"; 	char instr_end[20] = ")"; 	char line_check[200]; 	char chuan[20][200]; 	int len, i, j; 	static int first = 0; 	// 按行来读取，需要额外添加一行来读取行尾换行符 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp);  	while (0 != strcmp(instr_start, line_check) && !feof(fp)) { 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	//int parenthesis_count = 0; 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp); 	while (0 != strcmp(instr_end, line_check)) { 		//char chuan[10][200]; 		//fscanf(fp, "%[^\n]", line_check); 		//fgetc(fp); 		//int len,i,j; 		//static int first=0; 		len = strlen(line_check); 		for (i = 0; i < len; i++) { 			chuan[first][i] = line_check[i]; 		} 		first++; 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	fclose(fp); 	for (i = 0; i < first; i++) { 		for (j = 0; chuan[i][j] != '\0'; j++) { 			printf("%c", chuan[i][j]); 		} 		printf("\n"); 	} 	return 0; }  ～[/quote]  完了，估计我的系统是假的

user: user-1
content: 引用 16 楼 amotym 的回复:改完后依然使段错误（核心已转储） 上面最后提到的输出的循环，第一层的结束条件也改了一下， 从  i < first + 1 ; 改成了 i < first ; 忘了说了，但是上面的代码是看得到的。 还有段错误（核心已转储）的话，就把 数组长度再改小一点， 够用就行了。 俺这边运行没问题：  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(int argc, char const *argv[]) { 	FILE *fp; 	fp = fopen("01.xml", "r"); 	if (NULL == fp) { 		printf("Error! File open #1 failed!\n"); 		exit(EXIT_FAILURE); 	}  	/*遍历01.xml，得到所需数据的行数，即字符数组数*/ 	char instr_start[20] = "(:ins"; 	char instr_end[20] = ")"; 	char line_check[200]; 	char chuan[20][200]; 	int len, i, j; 	static int first = 0; 	// 按行来读取，需要额外添加一行来读取行尾换行符 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp);  	while (0 != strcmp(instr_start, line_check) && !feof(fp)) { 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	//int parenthesis_count = 0; 	fscanf(fp, "%[^\n]", line_check); 	fgetc(fp); 	while (0 != strcmp(instr_end, line_check)) { 		//char chuan[10][200]; 		//fscanf(fp, "%[^\n]", line_check); 		//fgetc(fp); 		//int len,i,j; 		//static int first=0; 		len = strlen(line_check); 		for (i = 0; i < len; i++) { 			chuan[first][i] = line_check[i]; 		} 		first++; 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	} 	fclose(fp); 	for (i = 0; i < first; i++) { 		for (j = 0; chuan[i][j] != '\0'; j++) { 			printf("%c", chuan[i][j]); 		} 		printf("\n"); 	} 	return 0; }  ～

user: user-0
content: 引用 15 楼 拥抱Linux 的回复:[quote=引用 14 楼 amotym 的回复:]  （～略～） 数组 line_check[100000] 和 chuan[20][20000]  的大小太大了， 超出了编译器允许分配给数组的内存空间的大小了，也就是说 这两个数组的定义是无效的，所以后面输出的时候会出现段错误。 原因：数组的内存空间是编译器自动分配在栈上面的，栈的空间是很小的，希望分配的内存空间超过了栈的大小的话，就会分配失败。 对应办法：（1）简单的，把数组长度定义小一点，根据你xml文件里每行的字符长度，定义个200、500啥的也绰绰有余了。（2）通用的，动态申请内存。 具体代码：按简单的办法，更改数组的长度为          char line_check[200]; 	char chuan[20][200];  另外，while (0 != strcmp(instr_end, line_check)) {下面的有两句语句多余了，注释掉，即  	while (0 != strcmp(instr_end, line_check)) { 		//char chuan[10][200]; 		//fscanf(fp, "%[^\n]", line_check); 		//fgetc(fp); 		//int len,i,j; 		//static int first=0; 		len = strlen(line_check); 		for (i = 0; i < len; i++) { 			chuan[first][i] = line_check[i]; 		} 		first++; 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	}  输出的循环，第2层循环的结束条件修改一下：  	for (i = 0; i < first; i++) { 		for (j = 0; chuan[i][j] != '\0'; j++) { 			printf("%c", chuan[i][j]); 		} 		printf("\n"); 	}  ～[/quote]   改完后依然使段错误（核心已转储）

user: user-1
content: 引用 14 楼 amotym 的回复:（～略～） 数组 line_check[100000] 和 chuan[20][20000]  的大小太大了， 超出了编译器允许分配给数组的内存空间的大小了，也就是说 这两个数组的定义是无效的，所以后面输出的时候会出现段错误。 原因：数组的内存空间是编译器自动分配在栈上面的，栈的空间是很小的，希望分配的内存空间超过了栈的大小的话，就会分配失败。 对应办法：（1）简单的，把数组长度定义小一点，根据你xml文件里每行的字符长度，定义个200、500啥的也绰绰有余了。（2）通用的，动态申请内存。 具体代码：按简单的办法，更改数组的长度为          char line_check[200]; 	char chuan[20][200];  另外，while (0 != strcmp(instr_end, line_check)) {下面的有两句语句多余了，注释掉，即  	while (0 != strcmp(instr_end, line_check)) { 		//char chuan[10][200]; 		//fscanf(fp, "%[^\n]", line_check); 		//fgetc(fp); 		//int len,i,j; 		//static int first=0; 		len = strlen(line_check); 		for (i = 0; i < len; i++) { 			chuan[first][i] = line_check[i]; 		} 		first++; 		fscanf(fp, "%[^\n]", line_check); 		fgetc(fp); 	}  输出的循环，第2层循环的结束条件修改一下：  	for (i = 0; i < first; i++) { 		for (j = 0; chuan[i][j] != '\0'; j++) { 			printf("%c", chuan[i][j]); 		} 		printf("\n"); 	}  ～

user: user-0
content: 引用 13 楼 拥抱Linux 的回复:[quote=引用 12 楼 amotym 的回复:] 每一行的符号中间字母不一样，设置循环全部判断一遍吗 字母在ASCII码表中是连续分布的呀，检查字符的ASCII码值是不是位于字母表的首尾字母的ASCII码值之间就可以判断字符是不是字母之一了呀。[/quote]  现在我改用存入（：ins到<instr>前的）中的内容存入数组，现在可以通过编译但是溢出？不知道是什么原因 #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(int argc, char const *argv[]) {     FILE *fp;     fp = fopen("test.xml", "r");     if (NULL == fp) {         printf("Error! File open #1 failed!\n");         exit(EXIT_FAILURE);     }      /*遍历01.xml，得到所需数据的行数，即字符数组数*/     char instr_start[20] = "(:ins";     char instr_end[20] = ")";     char line_check[100000];  char chuan[20][20000]; int len,i,j; 	static int first=0;     // 按行来读取，需要额外添加一行来读取行尾换行符     fscanf(fp, "%[^\n]", line_check);     fgetc(fp);      while (0 != strcmp(instr_start, line_check) && !feof(fp)) {         fscanf(fp, "%[^\n]", line_check);         fgetc(fp);     }     int parenthesis_count = 0;     fscanf(fp, "%[^\n]", line_check);     fgetc(fp);     while (0 != strcmp(instr_end, line_check)) { 	//char chuan[10][200]; 	fscanf(fp,"%[^\n]",line_check); 	fgetc(fp); 	//int len,i,j; 	//static int first=0; 	len=strlen(line_check); 	for(i=0;i<len;i++) 	{ 		chuan[first][i]=line_check[i]; 	} 	first++; 	fscanf(fp, "%[^\n]", line_check);         fgetc(fp);        }         fclose(fp); 	for(i=0;i<first+1;i++){ 		for(j=0;j<200;j++) 		{ 			printf("%c",chuan[i][j]); 		} 	printf("\n"); 	} return 0; 	}

user: user-1
content: 引用 12 楼 amotym 的回复:每一行的符号中间字母不一样，设置循环全部判断一遍吗 字母在ASCII码表中是连续分布的呀，检查字符的ASCII码值是不是位于字母表的首尾字母的ASCII码值之间就可以判断字符是不是字母之一了呀。

user: user-0
content: 引用 11 楼 拥抱Linux的回复:[quote=引用 10 楼 amotym 的回复:] instr中的内容，循环读取存入的时候，有tab键和（：的符号，不太好设置循环开始和结束的字符 找到特征就好了吧。 看你的说法，似乎应该是存入 符号中间的 字母， 那只要设置检测条件是 符号中间的 字母 就可以了吧。[/quote] 每一行的符号中间字母不一样，设置循环全部判断一遍吗

user: user-1
content: 引用 10 楼 amotym 的回复:instr中的内容，循环读取存入的时候，有tab键和（：的符号，不太好设置循环开始和结束的字符 找到特征就好了吧。 看你的说法，似乎应该是存入 符号中间的 字母， 那只要设置检测条件是 符号中间的 字母 就可以了吧。

user: user-0
content: 引用 6 楼 拥抱Linux的回复:[quote=引用 5 楼 amotym 的回复:] [quote=引用 3 楼 拥抱Linux的回复:]俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16[/quote] 你还是先尝试写写吧，遇到了具体的问题再提上来大伙儿帮你分析、解决。 ～[/quote] instr中的内容，循环读取存入的时候，有tab键和（：的符号，不太好设置循环开始和结束的字符

user: user-0
content: 引用 7 楼 amotym的回复:[quote=引用 6 楼 拥抱Linux的回复:][quote=引用 5 楼 amotym 的回复:] [quote=引用 3 楼 拥抱Linux的回复:]俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16[/quote] 你还是先尝试写写吧，遇到了具体的问题再提上来大伙儿帮你分析、解决。 ～[/quote] 在＜instr＞中的内容存入数组并查找后怎么将关键字的内容与另一个数组中的＜info＞内容依次进行匹配呀[/quote] 不行啊，存入循环的时候＜instr＞和＜/instr＞之间的内容开始有一个tab的位置

user: user-1
content: 引用 7 楼 amotym 的回复:[quote=引用 6 楼 拥抱Linux的回复:][quote=引用 5 楼 amotym 的回复:] [quote=引用 3 楼 拥抱Linux的回复:]俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16[/quote] 你还是先尝试写写吧，遇到了具体的问题再提上来大伙儿帮你分析、解决。 ～[/quote] 在＜instr＞中的内容存入数组并查找后怎么将关键字的内容与另一个数组中的＜info＞内容依次进行匹配呀[/quote] 查找，存储另一个的数组地址，建立映射关系。

user: user-0
content: 引用 6 楼 拥抱Linux的回复:[quote=引用 5 楼 amotym 的回复:] [quote=引用 3 楼 拥抱Linux的回复:]俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16[/quote] 你还是先尝试写写吧，遇到了具体的问题再提上来大伙儿帮你分析、解决。 ～[/quote] 在＜instr＞中的内容存入数组并查找后怎么将关键字的内容与另一个数组中的＜info＞内容依次进行匹配呀

user: user-1
content: 引用 5 楼 amotym 的回复:[quote=引用 3 楼 拥抱Linux的回复:]俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16[/quote] 你还是先尝试写写吧，遇到了具体的问题再提上来大伙儿帮你分析、解决。 ～

user: user-0
content: 引用 3 楼 拥抱Linux的回复:俺又来了。：） 楼主前面的那个提问帖和这个是大同小异吧，稍微改改应该就可以用了的。 直接按行读取文件中需要的内容，存入字符数组即可。 要求查询的话，考虑简单一点，就写个小函数，对所有字符数组从头到尾遍历一下，有一样的单词就返回或者打印出单词所在数组的下标（行、列）就可以了呀。 ～ 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16

user: user-0
content: 在＜instr＞和＜/instr＞中的内容要实现和＜info＞中的匹配，像（sort x remotecontrol）中的x进行和＜info＞中的sort 16 remotecontrol相匹配，x为16