C-программа Определить самую большую подстроку в массиве символов без «e» или «E»

У меня есть проблема, как указано в заголовке. Здесь подробнее.

Моя проблема:

а) разработать C-функцию, которая получает массив символов в качестве входного параметра и определяет наибольшую подстроку в этом массиве символов без 'e' 'E'. Выведите длину этой подстроки.

б) напишите основную функцию для проверки а) функции. используйте scanf("%[^\n]",...) или цикл с getchar()

ПРИМЕР: ввод: «вы один». .output : "ты" длина: 6


person MINH PHUNG DO    schedule 25.03.2015    source источник
comment
Но в We ar есть e...   -  person Carl Norum    schedule 25.03.2015


Ответы (3)


Улучшение формы ответов @ChartesL.:

#include<stdio.h>
int main(){
    char myStr[30];
    char *ptr;
    // read myStr from console
    ...
    char* delim = myStr;
    int longest = 0;
    char*longestSubStr = null;

    for(ptr=myStr; *ptr != '\0'; ptr++) 
    {  
       if(*ptr == 'e' || *ptr == 'E') 
       {
           int substrLength = ptr - delim;
           if(substrLength  > longest)
           {
               longest = substrLength;
               longestSubstr = delim;
           }
           delim = ptr+1;
       }      
    }
    // show longest length in longest
    // longest substring starts at longestSubStr, first 'longest' chars
    ...

    return 0;   
}

он запоминает последний разделитель (либо начало строки, либо "e", либо "E"), и всякий раз, когда обнаруживается новый разделитель, вычисляется длина подстроки между двумя разделителями. Затем определите самую длинную из этих длин и запомните самую длинную найденную подстроку.

person DrKoch    schedule 25.03.2015
comment
он печатает только символ после последней буквы «e» или «E» - person MINH PHUNG DO; 25.03.2015
comment
Я понимаю алгоритм, но я только начал учиться 3 дня назад. не могли бы вы написать весь код полностью. Я очень ценю это. благодарю вас. - person MINH PHUNG DO; 25.03.2015
comment
как я могу распечатать подстроку и ее длину. - person MINH PHUNG DO; 25.03.2015
comment
Извините, но это слишком просто, чтобы отвечать ей. Прочтите любую книгу о c, чтобы узнать об этом. - person DrKoch; 25.03.2015
comment
я знаю, я использую gets(myStr) для ввода. и printf(выход %s, longestSubStr). printf(%d, substrLength). распечатать самую длинную подстроку и длину. Но когда я запускаю aeaae, вывод также aeaae, а длина просто подсчитывает символ перед первым «e». - person MINH PHUNG DO; 25.03.2015
comment
Да. Как указано во фрагменте кода, результирующая строка начинается с longestSubStr. Найдите способ напечатать только первые longest символа этой строки. Подсказка: вы можете использовать strncpy() - person DrKoch; 25.03.2015

Если вы используете функцию библиотеки строк strtok, решение будет очень простым. Используя эту функцию, она извлекает для вас подстроки, а затем вы просто отслеживаете самую длинную из них.

temp = strtok(input, "eE");
strcpy(best, temp);
bestLen = strlen(best);

while(temp = strtok(NULL, "eE")) {
    if(strlen(temp) > bestLen) {
        strcpy(best, temp);
        bestLen = strlen(best);
    }
}
printf("%s", best);

strtok будет разделять вашу строку каждый раз, когда есть e или E, и возвращать ее в ваш временный указатель. Затем вы можете посмотреть на значение temp и посмотреть, достаточно ли оно для вашей новой оптимальной длины.

person Bmoore    schedule 25.03.2015

person    schedule
comment
Это не определяет длину. И это работает только для первой подстроки до первого e. Вопрос звучит так, будто он ожидает 4 для строки 1e1234e2. - person DrKoch; 25.03.2015
comment
Хм. пример для ввода-вывода. ВВОД: asdqEasdade, а вывод должен быть asdad. printf длина: 5. Не могли бы вы мне помочь, доктор Кох? - person MINH PHUNG DO; 25.03.2015
comment
Новый может быть лучше. - person whalesf; 25.03.2015
comment
какая-то ошибка слишком большого количества аргументов для getchar() ?. не могли бы вы проверить еще раз. - person MINH PHUNG DO; 25.03.2015
comment
Я прошу прощения за это. (Сделанный) - person whalesf; 25.03.2015