我们有一个函数最长,它返回由字母组成的最长子字符串。例如:
longest("112****hel 5454lllllo454")
会返回: lllllo
然而,当我运行该程序时,似乎返回 lllllo454 。这是功能:
char *longest(char *s){
char *pMax = NULL;
int nMax = 0;
char *p = NULL;
int n = 0;
int inside = 0; //flag
while(*s!='\0'){
char c = *s;
if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){
if(inside == 0){
n = 1;
p = s;
inside = 1;
}
else
n++;
if(inside == 1){
if(n > nMax){
nMax = n;
pMax = p;
inside = 0;
}
}
}//end isLetter if
s++;
}
return pMax;
}
我在这里找不到什么......你们觉得怎么样?
答案 0 :(得分:6)
您只是返回指向最长子字符串中第一个字符的指针。实际上,您不会在子字符串结尾之后添加字符串终止符,因此它会继续到原始字符串的末尾。您可能应该将子字符串(仅序列中的那些字符)复制到新字符串并返回指向该字符串的指针。
char* newStr = malloc(nMax+1);
strncpy( newStr, pMax, nMax );
*(newStr+nMax) = '\0';
return newStr;
答案 1 :(得分:3)
您正在计算nMax
,但没有对该信息做任何事情。在C中,char*
指向一个字符串的开头,该字符串由NUL字符终止。由于您没有修改传递给函数的缓冲区,因此返回的指针指向第一个'l'并继续到原始字符串的末尾。
答案 2 :(得分:0)
您将指针返回到最长子字符串的第一个字母;你没有用它来制作一个新的字符串。因此,当您将其打印出来时,它会打印子字符串直到NULL终止符。
请参阅strncpy函数:http://www.cplusplus.com/reference/clibrary/cstring/strncpy/
答案 3 :(得分:0)
这将返回以字符串开头的最大子字符串。设置inside
的函数部分如下:
if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){
c
是一封信时才会执行。由于您需要包含字母的最大子字符串,因此您需要:
if(c != ' '){
然后,在该循环中,有另一个变量,比如说containsLetter
,只有在另一个空格之前遇到一个字母时才是真的。