user-0 提问: 关于连续最长的字符串问题，自己摆弄了一天，没弄明白。求教。

回复:
user: user-0
content: 引用 2 楼 user-4 的回复:原理弄懂了没泥？你只要画个表格你就懂了，只要原理 懂了。。代码就好懂好写了我现在是想利用一个int的中间变量和一个中间buff来记录遍历时碰到的连续数字的长度和字符串内容，MaxLen 和 szMax来保存最长的连续数字的长度和字符串内容。我现在是在保存字符串的时间碰到了坎，心绪乱了。睡觉起来再弄，再过1个半小时就应该生病了吧，哎。

user: user-1
content: 你的程序有明显的问题：                line 47和line 49:    你新new出来两段内存，然后却将szCru和szMax指向了空字符串。注意你这里不是赋值，是改变指针指向！！此后的一切操作都肯定非法。                line 24 和 25， nI和nNum定义后根本没有使用过；                你的程序的算法我稍微研究了下，没看下去。你应该再多写一些注释，把思路写上去，这样更明晰  给你我的答案：   1  /*step 1) 找到下一个数字序列的起始位置   2  *         2) 根据升或者降一直找到这个序列的符合要求的最后一个数字，然后获得这个序列的长度   3  *         3) 如果这个序列比之前得到的最长序列还要长，把这个序列的起始位置和长度记录下来，顶替上一个最长序列   4  */   5    6 #include <ctype.h>   7 #include <string.h>   8 #include <stdio.h>   9 const int EndReached = 0;  10 const int MAXLENGTH = 128;  11 int getNextNumberSequence(const char*, unsigned int*);  12   13 int main()  14 {  15         char input_str[MAXLENGTH];  16         printf("please input the string\n");  17         scanf("%s",input_str);  18         unsigned int cur_pos = 0, end_pos;  19         /*cur_pos is the current positon in the input string, end_pos is the end position of the next number sequence\  20          * in the input string*/  21         unsigned int maxseq_len = 0, maxseq_beg, maxseq_end;  22         /*seq_len is the length of the longest number sequence, maxseq_beg and maxseq_end are its positions\               in the input string*/  23         while (1)  24         {  25                 end_pos = getNextNumberSequence(input_str,&cur_pos);  26                 if (end_pos != EndReached)  27                 {  28                         unsigned int seq_length = end_pos - cur_pos + 1;  29                         if (seq_length > maxseq_len)  30                         {  31                                 /*find a longer sequence, mark it*/  32                                 maxseq_len = seq_length; 3                                    maxseq_beg = cur_pos;  34                                 maxseq_end = end_pos;  35                         }  36                         cur_pos = end_pos;  37                         /*next time, we start search from end_pos*/  38                         if (end_pos == strlen(input_str) - 1)  39                                 /*the string has been scanned to the last character, time to stop*/  40                                 break;  41                 }  42                 else break;  43         }  44         printf("max number sequence length is %d\n",maxseq_len);  45         int i;  46         for (i = maxseq_beg; i <= maxseq_end; i++)  47                 printf("%c",input_str[i]);  48         return 0;  49 }  50   51 /*this function gets the next number sequence.   52  * It returns the end position of number sequence in the string,   53  * and parameter 'pos' is set to be the start position.  54  * If it returns -1(namely EndReached), end of string is reached*/  55 int getNextNumberSequence(const char* str, unsigned int *pos)  56 {  57         unsigned int str_len = strlen(str);  58         /*locate the first digit character*/  59         while ( (*pos) < str_len && !isdigit( str[*pos]) )  60                 (*pos)++; 61         if ((*pos) == str_len)  62         /*end of string reached*/  63                 return EndReached;  64         unsigned int end_pos = (*pos) + 1;  65         if (end_pos == str_len)  66         /*we haven arrived at the last character in the string, so this number sequence contains only one digit.*/  67                 return (*pos);  68         else  69         {  70                 int diff;  71                 /*if diff == 1,it's ascending; -1, descending*/  72                 if ( isdigit(str[end_pos]) )  73                         diff = str[end_pos] - str[(*pos)];  74                 if (diff == 1 || diff == -1)  75                         while ((++end_pos) < str_len && isdigit(str[end_pos])\  76                                         && (str[end_pos] - str[end_pos -1] == diff) );  77                                                 /*make sure it's uniformly ascending or descending*/  78         }  79         return end_pos - 1;  80 }

user: user-0
content: 引用 6 楼 cs290473786 的回复: #include <stdio.h>  unsigned int Continumax(char ** pOutputstr,char * intputstr) { 	char* pMaxStr = ""; 	char* pValue = intputstr; 	int maxLen = 0; 	while(*pValue != '\0') 	{ 		if (*pValue >= '0' && *pValue <= '9') 		{ 			unsigned int tempLen = 0; 			char* pTempPtr = pValue; 			while(*pValue >= '0' && *pValue <= '9' ) 			{ 				tempLen++; 				pValue++; 			} 			if (tempLen >= maxLen) 			{ 				pMaxStr = pTempPtr; 				maxLen = tempLen; 			} 		} 		pValue++; 	}  	for (int i = 0; i <= maxLen; i++) 		(*pOutputstr)[i] = pMaxStr[i]; 	 	return maxLen; } int _tmain(int argc, _TCHAR* argv[]) { 	char *pInputStr = "abcd12345ss54321";/*abcd12345ed1255ss123456789*/ 	char OutputStr[256] = {0}; 	char* pOutputStr = OutputStr; 	Continumax(&pOutputStr, pInputStr); 	printf("%s\n", pOutputStr); 	return 0; }主要是递增，递减这个功能实现起来麻烦。不过你的方法我先试一试。

user: user-0
content: 感谢各位大大，8楼给了我很大的帮助。我分就给他了。最后，我把我自己写的代码附上。/* 	在一个字符串中找出连续最长的字符串，并把这个最长的字符串返回。如果存在长度相同的连续字符串，返回最后一个字符串 	注意，数字不光要连着，还需要是连续的，比如1234，而不是1245，如果没有数字，则返回空字符串“” 而不是NULL！ 	样例输入 		abcd12345ed1255ss123456789  		abcd12345ss54321 	样例输出 		123456789,函数返回值9 		54321，函数返回值5 	接口说明 		函数原型： 		unsigned int Continumax(char ** pOutputstr,char * intputstr) 		输入参数： 		char * intputstr 输入字符串 		输出参数: 		char ** pOutputstr 连续最长的数字串，如果连续最长数字串长度为0，应该返回空字符串，如果输入空字符串也应该返回空字符串 		返回值：连续最长的数字串的长度 */ #include <iostream> #include <Cstring> using namespace std;   //1.大体动作：遍历整个字符串，寻找连续递增或递减的，最长的数字字符串 //2.记录连续递增或递减数列的起始位置和结束位置 //3.保存最长的数列的起始位置和结束位置 //4.把最长数列的内容保存到一个字符串中，然后输出。 bool ascending(char * inputstr,int nLen) { 	int temp = nLen; 	if (temp>=3) 	{ 		if ((*inputstr)>(*(inputstr-1))) 		{ 			return ((*inputstr)==*(inputstr-2)+2)?true:false; 		}else 		{ 			return ((*inputstr)==*(inputstr-2)-2)?true:false; 		} 	}else if (temp==2) 	{ 		if ((*inputstr)>(*(inputstr-1))) 		{ 			return ((*inputstr)==*(inputstr-1)+1)?true:false; 		}else 		{ 			return ((*inputstr)==*(inputstr-1)-1)?true:false; 		} 	}else { 			return true; 	}  } unsigned int Continumax(char ** pOutputstr,char * intputstr) { 	int MAxLen = 0; 	//pos_begin和pos_end记录连续数列的起始位置和结束位置  	int pos_begin = 0; 	int pos_end = 0; 	//tempLen记录当前数列的长度 	int tempLen = 0; 	//i用来记录遍历时指针偏移量 	int i=0; 	char * pTemp = intputstr; 	while (*pTemp !='\0')//遍历 	{ 		//找到连续递增或递减的数列 		if (*pTemp >='0'&&*pTemp<='9') 		{ 			tempLen++; 			//判断是否连续增或者连续减 			if (!ascending(pTemp,tempLen)) 			{ 				tempLen = 0; 			} 			//记录位置 			if (tempLen>MAxLen) 			{ 				pos_end = i; 				pos_begin = pos_end-tempLen+1; 				MAxLen = tempLen; 			} 		}else 		{ 			tempLen=0; 		} 		i++; 		pTemp++; 	} 	//把pos_begin 到ppos_end之间的内容传送给pOutputstr带出 	*pOutputstr = &intputstr[pos_begin]; 	return MAxLen; } int main() { 	char * inputstr=new char[256]; 	cin.getline(inputstr,256); 	char *pOutputstr = new char[256]; 	int Max_Len = Continumax(&pOutputstr,inputstr); 	int i=0; 	//因为当时传回来的只是连续数字长度的首个元素地址，所以要考虑长度。 	while (i<Max_Len) 	{ 		cout<<*pOutputstr; 		*pOutputstr++; 		i++; 	} 	cout<<","; 	cout<<Max_Len<<endl; 	//if (pOutputstr) 	//{ 	//	delete [] pOutputstr; 	//} 	return 0; } 如果最后delete[]不注释的话DOS窗口不回收。。。这个问题不明白。不过也是从29号晚上开始做这个题了，现在终于做出来了，8楼的思想是先找有效数据的位置，最后再考虑输出的问题。这个是我之前没有想透的。

user: user-2
content: #include <stdio.h>  unsigned int Continumax(char ** pOutputstr,char * intputstr) { 	char* pMaxStr = ""; 	char* pValue = intputstr; 	int maxLen = 0; 	while(*pValue != '\0') 	{ 		if (*pValue >= '0' && *pValue <= '9') 		{ 			unsigned int tempLen = 0; 			char* pTempPtr = pValue; 			while(*pValue >= '0' && *pValue <= '9' ) 			{ 				tempLen++; 				pValue++; 			} 			if (tempLen >= maxLen) 			{ 				pMaxStr = pTempPtr; 				maxLen = tempLen; 			} 		} 		pValue++; 	}  	for (int i = 0; i <= maxLen; i++) 		(*pOutputstr)[i] = pMaxStr[i]; 	 	return maxLen; } int _tmain(int argc, _TCHAR* argv[]) { 	char *pInputStr = "abcd12345ss54321";/*abcd12345ed1255ss123456789*/ 	char OutputStr[256] = {0}; 	char* pOutputStr = OutputStr; 	Continumax(&pOutputStr, pInputStr); 	printf("%s\n", pOutputStr); 	return 0; }

user: user-2
content: #include <stdio.h>  unsigned int Continumax(char ** pOutputstr,char * intputstr) { 	char* pMaxStr = ""; 	char* pValue = intputstr; 	int maxLen = 0; 	while(*pValue != '\0') 	{ 		if (*pValue >= '0' && *pValue <= '9') 		{ 			unsigned int tempLen = 0; 			char* pTempPtr = pValue; 			while(*pValue >= '0' && *pValue <= '9' ) 			{ 				tempLen++; 				pValue++; 			} 			if (tempLen >= maxLen) 			{ 				pMaxStr = pTempPtr; 				maxLen = tempLen; 			} 		} 		pValue++; 	}  	for (int i = 0; i <= maxLen; i++) 		(*pOutputstr)[i] = pMaxStr[i]; 	 	return maxLen; } int _tmain(int argc, _TCHAR* argv[]) { 	char *pInputStr = "abcd12345ss54321";/*abcd12345ed1255ss123456789*/ 	char OutputStr[256] = {0}; 	char* pOutputStr = OutputStr; 	Continumax(&pOutputStr, pInputStr); 	printf("%s\n", pOutputStr); 	return 0; }

user: user-2
content: #include <stdio.h>  unsigned int Continumax(char ** pOutputstr,char * intputstr) { 	char* pMaxStr = ""; 	char* pValue = intputstr; 	int maxLen = 0; 	while(*pValue != '\0') 	{ 		if (*pValue >= '0' && *pValue <= '9') 		{ 			unsigned int tempLen = 0; 			char* pTempPtr = pValue; 			while(*pValue >= '0' && *pValue <= '9' ) 			{ 				tempLen++; 				pValue++; 			} 			if (tempLen >= maxLen) 			{ 				pMaxStr = pTempPtr; 				maxLen = tempLen; 			} 		} 		pValue++; 	}  	for (int i = 0; i <= maxLen; i++) 		(*pOutputstr)[i] = pMaxStr[i]; 	 	return maxLen; } int _tmain(int argc, _TCHAR* argv[]) { 	char *pInputStr = "abcd12345ss54321";/*abcd12345ed1255ss123456789*/ 	char OutputStr[256] = {0}; 	char* pOutputStr = OutputStr; 	Continumax(&pOutputStr, pInputStr); 	printf("%s\n", pOutputStr); 	return 0; }

user: user-3
content: 函数返回找到的串长

user: user-3
content: unsigned int Continumax(char ** pOutputstr,char * intputstr) *pOutputstr 直接指向intputstr的某个位置，除非1）没找到，2）intputstr=NULL，3）intputstr=“”； 函数返回找到的串 这个问题，不需要 new 新的字符串，只需要纪录指针，和串长

user: user-4
content: 原理弄懂了没泥？你只要画个表格你就懂了，只要原理 懂了。。代码就好懂好写了

user: user-0
content: 默默地顶一下，顺便去吃个饭，回来再试试。