2015-12-02 2 views
-1

Я столкнулся с несколькими проблемами с программой, которую я пишу сейчас.strstr работает, только если моя подстрока находится в конце строки

  1. strstr выводит свою подстроку только если это в конце моей строки enter image description here
  2. также выводит некоторые символы мусор после того enter image description here
  3. У меня были проблемы с «Const символ * стоге сена», а затем добавить вход в него, так что я сделал это с fgets и GetChar петли
  4. где-то по пути он работал с подстроки, которая была не только в конце, но я выводимый подстроку, а остальные строки ATER, что

вот мой главный:

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

Там в завершающего «\ 0» отсутствует в стоге сена, который вызовет у вас все виды проблем. – gnasher729

ответ

2

Вы читаете одну строку с 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'; 
+0

1+ для использования 'strcspn()' :-) – alk

+0

Ограничение цикла чтения, чтобы не переполнять 'haystack' также было бы хорошо ... ;-) – alk

+0

Я вижу это, и я полностью согласен с иглой, поскольку я хочу, чтобы он ограничивался только одной строкой, но когда дело доходит до стога сена - я бы хотел, чтобы это было более 1 строки. Имея это в виду, могу ли я как-то это сделать, так что мне не нужно определять массив сена в массиве элементов [250], и он подсчитывает элементы, когда я заканчиваю ввод? Но тогда возникла бы другая проблема, так как у меня не было бы \ n в моей игле, но у меня было бы это в стоге сена - эрго это не соответствовало бы, если бы игла разделилась на 2 строки в моей стоге сена. – NoobProgrammerWannabe

Смежные вопросы