C - If / Else и Pointers возвращают неправильную строку - PullRequest
1 голос
/ 07 октября 2009

У нас есть функция longest , которая возвращает самую длинную подстроку, состоящую из букв. Пример:

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 ]

6 голосов
/ 07 октября 2009

Вы просто возвращаете указатель на первый символ в самой длинной подстроке. Вы на самом деле не добавляете терминатор строки после конца подстроки, поэтому он продолжается до конца исходной строки. Возможно, вам следует скопировать подстроку (только те символы в последовательности) в новую строку и вернуть указатель на нее.

 char* newStr = malloc(nMax+1);
 strncpy( newStr, pMax, nMax );
 *(newStr+nMax) = '\0';
 return newStr;
3 голосов
/ 07 октября 2009

Вы вычисляете nMax, но ничего не делаете с этой информацией. В C char* указывает на начало строки символов, которая заканчивается символом NUL. Так как вы не изменяете буфер, переданный вашей функции, возвращаемый указатель указывает на первый 'l' и продолжается до конца исходной строки.

0 голосов
/ 07 октября 2009

Возвращает наибольшую подстроку , которая начинается со строки .Часть функции, которая устанавливает inside, следующим образом:

if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')){

будет выполняться, только если c является буквой.Так как вам нужна самая большая подстрока, которая включает букву, вам нужно, чтобы она была:

if(c != ' '){

Затем внутри этого цикла есть другая переменная, скажем containsLetter, это верно только в том случае, если вы встречаете букву перед другим пробелом.

0 голосов
/ 07 октября 2009

Вы возвращаете указатель на первую букву самой длинной подстроки; Вы не делаете новую строку из этого. Таким образом, когда вы распечатываете его, он печатает подстроку до терминатора NULL.

См. Функцию strncpy: http://www.cplusplus.com/reference/clibrary/cstring/strncpy/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...