Test code

	$(document).ready(function() {
		
		alert();

		$.ajax({
			type: "get",//使用get方法访问后台
            dataType: "json",//返回json格式的数据

			  url: "http://127.0.0.1:8080/pxcoa/user/load.jsp",

			  error:function(){alert("error");
			  //ajax提交失败的处理函数!
			  },

			  success: function(data){
				  alert(data);
				  //var dataObj=eval("("+data+")");//转换为json对象 
					//debugger;
				    //alert(dataObj.length());
					// alert(dataObj.root[1].root2[0].name);
			  }			});
		
	});
	

 

<%@ page language="java" import="com.pxc.oa.action.*"  contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%
//Qxoazdlb w=new Qxoazdlb();

//out.print(w.GetZdlbById());
//out.print("[{'userbmmc':'Java','userbm':'java'},{'userbmmc':'EXTJS','userbm': 'extjs'}]");
//out.print("[{"+""userbmmc""+":"+"01"+"','userbm':'教务处'},{'userbmmc':'02','userbm':'计算机系'},{'userbmmc':'03','userbm':'外语系'}]");


//out.print("{ root: [ {name:'6109',value:'安康市'}, {name:'6110',value:'商洛市'} ] }"); 
out.print("{ root: [{ root1: [{name:'610ff9',value:'安康市'} ] } ,{ root2: [{name:'610ff9',value:'安康市'} ] }] }"); 
//out.print(" {root: [qq:[ {name:'1',value:'0'},{name:'1',value:'0'}, {name:'6101',value:'西安市'}]}]}"); 



System.out.println("============================");


%>

 

 

<think>我们有两个示例字符串:'string test code:12' 和 'wang test code:12' 要求:从字符串中提取code:%d中的数字,且字符串以"code:"结尾,并且字符串中只出现一次数字(即我们要提取的数字) 思路: 1. 首先检查字符串是否以"code:"结尾(注意:这里可能是"code:",也可能是其他空白字符,如空格等,但数字紧跟在冒号后面?) 2. 在满足条件1的情况下,提取出数字,并且要求整个字符串中只有这一个数字。 但是,注意我们的示例字符串中,数字是在最后,并且前面可能有空格。例如,在"string test code:12"中,数字12前面有一个冒号,可能还有空格?实际上,示例中冒号后面直接跟数字。 由于要求整个字符串中只出现一次数字,我们可以这样处理: - 从字符串末尾开始向前扫描,直到遇到非数字字符(这样我们可以提取出最后的数字) - 然后检查这个数字前面的字符串是否以"code:"结束(注意,这里"code:"后面可能允许有空格,但数字前不能有其他非空格字符?) 但是,题目要求字符串以"code:"结尾,并且只出现一次数字。所以我们可以这样设计步骤: 步骤1:使用一个指针从字符串末尾开始向前扫描,直到遇到非数字字符,这样我们就提取了末尾的数字部分。 步骤2:然后继续向前扫描,跳过空格,直到遇到非空格字符,然后检查这个位置向前是否是"code:"(注意,这里要求是"code:",但可能大小写?题目没有说明,我们假设大小写敏感,且为小写)。 然而,题目要求整个字符串中只出现一次数字,所以我们需要确保在提取的数字之前没有其他数字。 我们可以这样: - 先提取末尾的数字(假设是连续的数字字符) - 然后检查这个数字前面的字符串是否以"code:"结尾(允许有空格) - 最后,检查整个字符串中除了末尾这个数字外,没有其他数字。 但是,这样效率可能不高。我们可以用正则表达式来匹配,但C语言中正则表达式不是标准库,所以我们可以自己写一个简单的解析。 另一种思路: - 先找到字符串中最后一个冒号(因为"code:"中有一个冒号),然后检查冒号前面的字符串是否是"code"(忽略大小写?题目没有说,我们按原样匹配)。 - 然后提取冒号后面的数字(可能允许有空格),并检查整个字符串中是否只有这一个数字。 但是,题目要求字符串以"code:"结尾,所以冒号必须在字符串的末尾部分,并且后面只有数字。 具体步骤: 1. 从后往前扫描,找到第一个冒号(':')的位置。 2. 检查这个冒号前面的5个字符(包括冒号的位置,实际上我们需要检查冒号前面的子串是不是"code")?注意,如果冒号前面有空格怎么办?题目要求以"code:"结尾,所以冒号后面是数字,前面应该是"code"(没有空格?但实际可能有空格,比如"code : 12"?题目没有明确,但示例中没有空格。所以我们需要灵活处理:允许"code:"后面有空格,然后才是数字。 但是,题目要求字符串以"code:"结尾,所以"code:"应该是字符串的结束部分,后面只有数字。所以我们可以这样: 步骤: a. 从字符串末尾开始,向前跳过所有数字(如果末尾没有数字,则不符合条件)。 b. 然后跳过空格(如果有的话)。 c. 检查此时的位置是否指向一个冒号(':'),然后紧接着(向前)是"code"(注意顺序:从冒号往前,应该是'c','o','d','e',但是顺序是反的?所以我们可以从冒号位置向前检查5个字符(包括冒号)是否构成"code:"?注意,冒号是最后一个字符,那么前面的5个字符应该是从位置len-5到len-1,其中len-5到len-1的前4个字符应该是"code",最后一个字符是冒号?这样不对,因为冒号在中间。实际上,我们期望的字符串是:...code:123,但要求以code:结尾,那么code:123并不以code:结尾,而是以123结尾。所以这里题目要求的是以"code:"结尾,但后面还跟了数字?这似乎矛盾。 重新理解题目:字符串以"code:"结尾,且只出现一次数字。注意,这里的“结尾”可能是指“code:”出现在字符串的末尾部分,然后后面跟着数字,但整个字符串的结尾是数字。所以实际上,字符串并不是以"code:"作为结束,而是以数字结束。所以题目描述可能有歧义。 根据示例:'string test code:12',整个字符串以"12"结尾,所以题目要求的是:字符串的结尾部分必须是"code:数字"的形式,并且整个字符串中只有一个数字(即这个数字)。 因此,我们修改要求:字符串的末尾必须是"code:数字"的形式,并且整个字符串中只出现一次数字(即这个末尾的数字)。 所以,我们可以这样: 1. 检查字符串末尾部分:是否存在一个子串"code:",然后后面是一个数字序列,并且这个数字序列一直到字符串结尾,且前面没有其他数字。 但是,如何确保没有其他数字?我们需要在"code:"前面的部分中不包含任何数字。 因此,步骤: 1. 找到字符串中最后一个"code:"子串的位置(因为可能有多个,但题目要求只出现一次,所以我们应该找最后一个,因为它在末尾)。 2. 如果找到了,那么从"code:"后面开始到字符串结束,应该是一个数字序列(可能允许有空格?但示例没有空格,所以为了严谨,我们允许空格,但题目要求只出现一次数字,所以如果有空格,那么空格后面不能有数字,否则就是多个数字?所以,我们要求"code:"后面只能有空格和数字,且数字必须连续出现(中间不能有空格)?或者允许空格,但整个后面部分只能有一个数字序列?) 具体实现: 1. 首先,我们找到最后一个出现的"code:"子串。注意,如果字符串中有多个"code:",那么最后一个应该是最靠近末尾的。 2. 如果找到了,假设位置为pos(即"code:"的第一个字符的位置),那么"code:"的结束位置是pos+5(因为"code:"长度为5,包括冒号)。 3. 然后,从pos+5开始到字符串末尾,我们跳过空格,然后应该是一个连续的数字序列(直到字符串末尾,中间不能有非数字字符,除了开头的空格)。 4. 同时,我们要确保在字符串的前半部分(0到pos-1)没有数字。 但是,这样可能太严格:因为字符串前半部分可能包含数字,但题目要求整个字符串只出现一次数字。所以,我们要求整个字符串中,除了"code:"后面的数字序列外,其他地方不能有数字。 所以,我们可以: a. 提取"code:"后面的部分,去除前面的空格,然后检查是否是一个整数(连续的0-9字符)。 b. 然后检查字符串的前半部分(0到pos-1)是否包含任何数字。如果包含,则不符合条件(因为要求整个字符串只出现一次数字,所以前面不能有数字)。 步骤: 1. 找到最后一个"code:"的位置pos(如果没找到,返回错误)。 2. 设start = pos + 5(即冒号后面的位置),然后设置end为字符串末尾。 3. 从start开始,跳过空格,然后从第一个非空格字符开始,必须是一个数字序列直到字符串末尾(即从该位置到末尾,只能有数字,不能有其他字符)。 4. 提取这个数字序列。 5. 检查子串[0, pos-1]中是否包含数字。如果有,则无效(因为整个字符串只能有一个数字,即我们提取的那个)。 注意:如果"code:"后面没有数字,或者有非数字字符,则无效。 代码实现: 由于C语言中没有内置的字符串查找函数(实际上有strstr,但用于找子串),我们可以用strstr从后往前找最后一个匹配?但标准库没有提供,我们可以自己实现。 或者,我们可以从后往前扫描: 步骤: - 从字符串末尾开始,向前查找子串"code:"(注意:从后往前找,找到的第一个就是最后一个)。但是,我们也可以多次调用strstr,但效率低。 这里,我们用一个简单的方法:从字符串开头到结尾,我们记录所有出现"code:"的位置,然后取最后一个。 但是,为了简单,我们假设字符串中只有一个"code:"(因为题目要求只出现一次,所以字符串中应该只有一个"code:")。所以,我们可以用strstr找到第一个出现的,但如果有多个,我们要求是最后一个?题目要求只出现一次,所以应该只有一个。 因此,我们假设字符串中"code:"只出现一次。 所以,步骤: 1. 用strstr找到"code:"的位置pos。 2. 如果pos为NULL,则没有找到,返回错误。 3. 然后,计算数字部分开始位置:start = pos + 5(跳过"code:"的长度5)。 4. 跳过空格:while (start[0]==' ') start++; 5. 然后,检查从start开始到字符串末尾,是否都是数字?并且至少有一个数字。 6. 同时,检查字符串的前半部分(从0到pos)是否有数字:遍历0到pos,如果有数字则失败。 但是,注意:数字部分可能包含负数?题目没有说,示例是正数。而且题目要求是%d,所以可能是整数,但负数也是整数。但示例没有负数,所以我们可以先不考虑负数,或者根据需求扩展。 题目要求是提取数字,所以负数也是数字。那么,我们如何支持负数? 修改:在步骤4之后,我们检查start位置是否是负号?如果是,则跳过,然后后面必须是数字。 所以,步骤4和5改为: 4. 跳过空格,然后检查是否遇到负号('-'),如果遇到,则记录负号,并后移一位。 5. 然后检查后续字符必须都是数字,且至少有一个数字。 但是,整个字符串中只出现一次数字,所以这个数字只能是这个(包括负号)。 同时,在检查前半部分时,负号不能出现在数字中(因为前半部分不允许有数字,所以负号也不能出现?但负号单独出现不是数字,所以前半部分可以出现负号,只要后面没有数字跟着就行?但是,我们检查前半部分时,需要检查是否有数字字符(0-9),而不检查负号,因为负号只有和数字连在一起才构成数字。所以,我们只检查前半部分是否有0-9。 因此,步骤: 1. 找到"code:"的位置pos。 2. 如果没找到,返回错误。 3. 令start = pos + 5,跳过空格。 4. 检查start位置是否是负号,如果是,则start++,并标记有负号。 5. 然后,从start位置开始,必须有一个或多个数字,并且直到字符串末尾,中间不能有非数字字符(即,我们扫描直到末尾,如果遇到非数字,则失败)。 6. 提取数字字符串,转换为整数(注意负号)。 7. 检查字符串的前半部分(从0到pos-1)中是否有任何数字字符(0-9),如果有,则失败(因为整个字符串只能有一个数字,即我们提取的那个)。 但是,注意:前半部分中,如果出现负号后面没有数字,那么负号不算数字,所以可以出现。所以,我们只检查0-9字符。 代码实现(C语言): 注意:我们假设字符串是可修改的(或者使用指针操作),但这里我们只读取。 我们将这个逻辑写成一个函数: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 函数:从字符串s中提取满足条件的数字,成功返回1,失败返回0,提取的数字存储在num中 int extract_code_number(const char *s, int *num) { // 1. 查找子串"code:" const char *sub = "code:"; const char *pos = strstr(s, sub); if (pos == NULL) { return 0; // 没有找到 } // 2. 计算"code:"后面的部分 const char *start = pos + strlen(sub); // 跳过"code:" // 跳过空格 while (*start == ' ') { start++; } // 3. 检查是否有负号 int sign = 1; if (*start == '-') { sign = -1; start++; } // 4. 检查后面是否至少有一个数字 if (!isdigit(*start)) { return 0; } // 5. 提取数字部分(直到字符串末尾,且必须是连续数字) char *end_ptr; // 使用strtol将数字字符串转换为整数,它会自动处理连续数字,并返回结束位置 long value = strtol(start, &end_ptr, 10); // 注意:strtol会跳过空格吗?不会,因为我们已经跳过了。而且我们要求数字是连续的,所以end_ptr应该指向字符串结束(\0)或者非数字 // 6. 检查end_ptr是否到达字符串末尾?因为我们要求数字后面不能有其他非数字字符(除了字符串结束) if (*end_ptr != '\0') { // 如果数字后面还有非数字字符,则无效 return 0; } // 7. 检查前半部分(从字符串开始到pos)是否有数字字符 const char *p = s; while (p < pos) { if (isdigit(*p)) { // 发现数字字符,不符合条件 return 0; } p++; } // 8. 赋值 *num = (int)(sign * value); return 1; } ``` 测试: 示例1: "string test code:12" 查找"code:",位置在"string test code:12"中的"code:"位置(即"string test "后面) 然后start指向"12"的'1',跳过空格(这里没有空格),提取数字12。 检查前半部分"string test ",没有数字,所以成功。 示例2: "wang test code:12" 同理。 示例3: "code: -123" 注意:这里有空格,所以start跳过空格后遇到负号,然后提取123,符号为负,所以是-123。 前半部分为空,没有数字,成功。 示例4: "test123 code:456":前半部分有"123",所以会失败(因为要求整个字符串只能有一个数字,但前半部分出现了数字)。 示例5: "code:12ab":在数字12后面有"ab",所以end_ptr没有指向字符串末尾,失败。 但是,这个函数有一个问题:它要求数字部分后面不能有任何字符(即数字必须是整个字符串的结尾)。这符合题目要求吗?题目要求字符串以"code:"结尾,但后面有数字,所以整个字符串的结尾是数字。所以,数字后面不能有其他字符,所以要求数字后面就是字符串结束。 所以,这个函数是符合的。 但是,我们考虑另一种情况:字符串中可能有多个"code:",但题目要求只出现一次,所以我们的函数只找第一个出现的"code:"。但题目要求字符串中"code:"只出现一次,所以没有问题。然而,如果出现多个,那么我们的函数会找到第一个,然后检查第一个后面的部分,但可能不符合整个字符串的结尾要求(因为后面的"code:"可能不在末尾)。所以,我们需要找最后一个出现的"code:"。 修改:如何找最后一个出现的"code:"? 我们可以从后往前找,但C标准库没有直接提供。我们可以自己写一个: ```c const char *strrstr(const char *s, const char *sub) { if (!s || !sub) return NULL; const char *last = NULL; const char *tmp = s; while ((tmp = strstr(tmp, sub)) != NULL) { last = tmp; tmp += strlen(sub); // 跳过当前找到的,继续往后找 } return last; } ``` 然后,将上面的strstr替换为strrstr。 但是,题目要求字符串中只出现一次"code:",所以理论上第一个和最后一个是一样的。但为了健壮,我们使用最后一个。 因此,修改函数: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> const char *strrstr(const char *s, const char *sub) { if (!s || !sub || *sub=='\0') return NULL; const char *last = NULL; const char *tmp = s; size_t sub_len = strlen(sub); while ((tmp = strstr(tmp, sub)) != NULL) { last = tmp; tmp += sub_len; // 跳过当前找到的,继续往后找 } return last; } int extract_code_number(const char *s, int *num) { const char *sub = "code:"; size_t sub_len = strlen(sub); const char *pos = strrstr(s, sub); if (pos == NULL) { return 0; } const char *start = pos + sub_len; // 跳过空格 while (*start == ' ') { start++; } int sign = 1; if (*start == '-') { sign = -1; start++; } if (!isdigit(*start)) { return 0; } char *end_ptr; long value = strtol(start, &end_ptr, 10); if (*end_ptr != '\0') { return 0; } // 检查前半部分(从字符串开始到pos)是否有数字字符 const char *p = s; while (p < pos) { if (isdigit(*p)) { return 0; } p++; } *num = (int)(sign * value); return 1; } ``` 测试: 示例: "test code:123 code:456" 我们要求只出现一次"code:",但这里出现了两次,所以不符合题目要求。但我们的函数会找到最后一个"code:"(即"code:456"),然后检查前半部分(从开始到最后一个"code:"的前面)是否有数字?前半部分是"test code:123 ",其中"123"是数字,所以会失败。所以这个字符串不符合条件。 因此,这个函数符合题目要求。 但是,如果字符串中只有一个"code:",但它在中间,后面还有非数字字符?比如:"code:12 is not end",那么我们的函数会找到这个"code:",然后提取"12",但是后面有" is not end",所以end_ptr不会指向字符串末尾,所以会失败。 所以,这个函数是符合的。 使用示例: ```c int main() { const char *s1 = "string test code:12"; const char *s2 = "wang test code:12"; const char *s3 = "code: -123"; const char *s4 = "test123 code:456"; const char *s5 = "code:12ab"; const char *s6 = "multiple code:34 code:56"; int num; if (extract_code_number(s1, &num)) { printf("'%s' -> %d\n", s1, num); } else { printf("'%s' -> failed\n", s1); } if (extract_code_number(s2, &num)) { printf("'%s' -> %d\n", s2, num); } else { printf("'%s' -> failed\n", s2); } if (extract_code_number(s3, &num)) { printf("'%s' -> %d\n", s3, num); } else { printf("'%s' -> failed\n", s3); } if (extract_code_number(s4, &num)) { printf("'%s' -> %d\n", s4, num); } else { printf("'%s' -> failed\n", s4); } if (extract_code_number(s5, &num)) { printf("'%s' -> %d\n", s5, num); } else { printf("'%s' -> failed\n", s5); } if (extract_code_number(s6, &num)) { printf("'%s' -> %d\n", s6, num); } else { printf("'%s' -> failed\n", s6); } return 0; } ``` 预期输出: s1: 12 s2: 12 s3: -123 s4: failed(因为前半部分有123) s5: failed(因为数字后面有ab) s6: failed(因为前半部分有34,且有两个code:,但题目要求只出现一次,所以应该失败,而且前半部分有数字34) 注意:s6中,我们找到最后一个code:(即"code:56"),然后检查前半部分("multiple code:34 ")包含数字34,所以失败。 这个函数符合题目要求。 但是,题目要求字符串以"code:"结尾?注意,我们的函数要求数字后面就是字符串结束,所以整个字符串的结尾是数字,而"code:"在数字的前面,所以整个字符串的结尾是数字,而不是"code:"。所以题目描述可能有歧义,但根据示例,这样处理是合理的。 另外,我们假设"code:"是固定的子串,并且大小写敏感。如果要求不区分大小写,则需要进行转换,这里我们按大小写敏感处理。 最后,我们提供完整的C代码示例。 注意:strrstr函数中,如果sub是空字符串,我们返回NULL。另外,我们使用size_t sub_len = strlen(sub);然后跳过当前匹配的子串。 完整代码: 将上述代码整合到一个文件中。 注意:在提取数字时,我们使用了strtol,它会自动转换连续的数字,并返回结束位置。我们要求结束位置必须是字符串的末尾(即'\0'),所以数字后面不能有其他字符。 另外,我们检查前半部分是否有数字时,只检查0-9,不检查负号,因为负号只有和数字在一起才构成数字,而题目要求整个字符串只出现一次数字(即我们提取的那一个),所以前半部分不能有数字字符(0-9)。 因此,我们提供了C语言的解决方案。</think>以下是用C语言处理类似"string test code:12"和"wang test code:12"字符串的完整解决方案。该方案从字符串中提取"code:"后的数字,并确保整个字符串中只出现一次数字(即要提取的数字): ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> // 查找字符串中最后一个子串的位置 const char* strrstr(const char* str, const char* substr) { if (!str || !substr) return NULL; const char* last = NULL; const char* tmp = str; while ((tmp = strstr(tmp, substr)) != NULL) { last = tmp; tmp++; // 继续向后搜索 } return last; } // 从字符串中提取code后的数字 int extract_code_number(const char* str, int* result) { const char* code_ptr = strrstr(str, "code:"); if (!code_ptr) return 0; // 未找到"code:" // 定位数字起始位置(跳过冒号和空格) const char* num_start = code_ptr + 5; // 跳过"code:" while (*num_start == ' ') num_start++; // 跳过空格 // 处理可能的负号 int sign = 1; if (*num_start == '-') { sign = -1; num_start++; } // 验证数字部分 if (!isdigit(*num_start)) return 0; // 提取数字 char* end_ptr; long num = strtol(num_start, &end_ptr, 10); // 验证数字后无其他字符 if (*end_ptr != '\0') return 0; // 检查字符串前半部分是否有其他数字 for (const char* p = str; p < code_ptr; p++) { if (isdigit(*p)) return 0; } *result = (int)(sign * num); return 1; } int main() { const char* test1 = "string test code:12"; const char* test2 = "wang test code:12"; const char* test3 = "error code:-404"; const char* test4 = "invalid: code:5x"; // 无效:数字后有多余字符 const char* test5 = "code:100 and 200"; // 无效:多个数字 int num; if (extract_code_number(test1, &num)) printf("'%s' -> %d\n", test1, num); else printf("'%s' -> 提取失败\n", test1); if (extract_code_number(test2, &num)) printf("'%s' -> %d\n", test2, num); else printf("'%s' -> 提取失败\n", test2); if (extract_code_number(test3, &num)) printf("'%s' -> %d\n", test3, num); else printf("'%s' -> 提取失败\n", test3); if (extract_code_number(test4, &num)) printf("'%s' -> %d\n", test4, num); else printf("'%s' -> 提取失败\n", test4); if (extract_code_number(test5, &num)) printf("'%s' -> %d\n", test5, num); else printf("'%s' -> 提取失败\n", test5); return 0; } ``` ### 代码说明: 1. **核心函数**: - `strrstr()`:查找最后一个子串位置(C标准库无此函数) - `extract_code_number()`:主逻辑函数,执行数字提取 - 查找最后一个"code:"位置 - 跳过空格处理负号 - 验证并提取数字 - 检查整个字符串是否只含一个数字 2. **关键验证点**: - 必须包含"code:"子串 - "code:"后必须是有效整数(允许负数) - 数字后不能有其他字符 - 整个字符串不能有其他数字 3. **测试用例**: ```text "string test code:12" -> 12 "wang test code:12" -> 12 "error code:-404" -> -404 "invalid: code:5x" -> 失败(数字后有多余字符) "code:100 and 200" -> 失败(多个数字) ``` ### 处理流程: 1. 定位最后一个"code:"位置 2. 跳过冒号和空格 3. 处理可能的负号 4. 使用`strtol()`提取数字 5. 验证数字后无其他字符 6. 检查字符串前半部分无其他数字 ### 相关问题: 1. 如何提取包含小数的数字(如"code:3.14")? *修改数字验证部分为正则表达式`[+-]?\\d*\\.?\\d+`* 2. 如何不区分"code:"的大小写? *添加字符串大小写转换逻辑,如使用`tolower()`预处理* 3. 如果字符串中有多个"code:"但只需第一个? *将`strrstr()`改为`strstr()`并调整验证逻辑* 4. 如何优化大字符串的处理性能? *使用单次遍历算法替代多次扫描* 5. 如何支持十六进制数字(如"code:0xFF")? *修改`strtol()`的基数参数为16并添加"0x"前缀识别*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值