C - If / Else和Pointers返回错误的字符串

时间:2009-10-07 02:20:20

标签: c string pointers

我们有一个函数最长,它返回由字母组成的最长子字符串。例如:

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;
}

我在这里找不到什么......你们觉得怎么样?

4 个答案:

答案 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,只有在另一个空格之前遇到一个字母时才是真的。