strstr работает, только если моя подстрока находится в конце строки

Я столкнулся с парой проблем с программой, которую сейчас пишу.

  1. strstr выводит мою подстроку, только если она находится в конце моей строки введите здесь описание изображения
  2. он также выводит некоторые символы мусора после этого введите здесь описание изображения
  3. У меня были проблемы с "const char *haystack" и последующим добавлением к нему ввода, поэтому я сделал это с циклом fgets и getchar
  4. где-то по пути он работал с подстрокой, которая была не только в конце, но потом я вывел подстроку и остальную часть строки после этого

вот мой основной:

int main() {
    char    haystack[250],
            needle[20];

    int     currentCharacter,
            i=0;

    fgets(needle,sizeof(needle),stdin); //getting my substring here (needle)

    while((currentCharacter=getchar())!=EOF) //getting my string here (haystack)

    {
        haystack[i]=currentCharacter;
        i++;
    }

    wordInString(haystack,needle);

    return(0);
}

и моя функция:

int wordInString(const char *str, const char * wd)
{
    char *ret;
    ret = strstr(str,wd);

    printf("The substring is: %s\n", ret);
    return 0;
}

person NoobProgrammerWannabe    schedule 02.12.2015    source источник
comment
В стоге сена отсутствует завершающий '\0', что вызовет у вас всевозможные проблемы.   -  person gnasher729    schedule 02.12.2015


Ответы (1)


Вы читаете одну строку с fgets(), а другую с getchar() до конца файла. В конце обеих строк есть конечный '\n', поэтому strstr() может соответствовать подстроке, только если она находится в конце основной строки. Кроме того, вы не сохраняете '\0' в конце haystack. Вы должны сделать это, потому что haystack является локальным массивом (автоматическое хранилище) и поэтому не инициализируется неявно.

Вы можете исправить проблему следующим образом:

//getting my substring here (needle)
if (!fgets(needle, sizeof(needle), stdin)) {
    // unexpected EOF, exit
    exit(1);
}
needle[strcspn(needle, "\n")] = '\0';

//getting my string here (haystack)
if (!fgets(haystack, sizeof(haystack), stdin)) {
    // unexpected EOF, exit
    exit(1);
}
haystack[strcspn(haystack, "\n")] = '\0';
person chqrlie    schedule 02.12.2015
comment
1+ за использование strcspn() :-) - person alk; 02.12.2015
comment
Также было бы неплохо ограничить цикл чтения, чтобы не переполнять haystack... ;-) - person alk; 02.12.2015
comment
Я вижу это и полностью согласен с иглой, так как я хочу, чтобы она ограничивалась только одной строкой, но когда дело доходит до стога сена, я бы хотел, чтобы это было больше, чем 1 строка. Имея это в виду, могу ли я как-то это сделать, чтобы мне не нужно было определять стог сена как массив элементов [250], и он будет считать элементы, когда я закончу ввод? Но тогда возникла бы другая проблема, так как у меня не было бы \n в моей игле, но она была бы в стоге сена - следовательно, она не совпадала бы, если бы игла была разделена на 2 строки в моем стоге сена. - person NoobProgrammerWannabe; 02.12.2015
comment
Вы можете переводить строки neelines в пробелы, когда читаете остальную часть стандартного ввода в буфер стога сена. - person chqrlie; 02.12.2015