Scanf не принимает вторую строку символов - PullRequest
0 голосов
/ 26 марта 2012

У меня есть функция бинарного поиска, которая будет искать слово в массиве, но прежде чем я смогу найти массив, мне нужно знать, какое слово искать.Я написал код, чтобы попросить пользователя ввести, но программа распечатывает запрос на ввод, но ничего от пользователя не принимает.Я думал, что это проблема буфера, так как у меня есть начальный scanf в программе, который загружает все строки символов из внешнего файла и помещает их в массив.Я попытался использовать fflush после моего первоначального сканирования, и я попытался переписать второй с помощью get, как указывалось в предыдущих темах.Возможно, я не реализую это правильно.Вот что у меня есть, и любые советы о том, почему второй сканф не работает, приветствуются.

#include "set.h"
#include "sortAndSearch.h"
#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main(){
char names[320][30];
char str[30];  
int i, j;
char *key;
int numOfWords;
char userWord[30];
Set set1, set2, set3;

//scan each char string into array names
for(i=0; scanf("%s", str) != EOF; i++){
        strcpy(names[i], str);
}

//set number of words in file
numOfWords = i;

//sort names array
//bubbleSort(names, numOfWords);

//print out names, sorted
//for(i=0; i<numOfWords; i++){
//      printf("%s\n", names[i]);
//}

printf("What word would you like to search for? ");
scanf("%s", userWord);

//addName2Set(set1, userWord);

return 0;
}

Ответы [ 3 ]

4 голосов
/ 26 марта 2012

Ваш второй scanf не работает, потому что ваш первый scanf никогда не заканчивается. scanf не вернет EOF, если входной поток не будет закрыт - консоль закроется.

Поскольку scanf возвращает количество прочитанных символов, вместо этого вы должны поставить условие цикла scanf(%s, str) != 0. Это завершит цикл, как только пользователь нажмет ввод, ничего не вводя.

0 голосов
/ 26 марта 2012

Ваш вопрос и код на первый взгляд казались ужасно смещенными ...

scanf() - это неправильная функция для чтения из вашего файла, вам нужно fscanf(), или если файл отформатирован так, что каждыйслово в отдельной строке fgets() тоже работает (перевод строки останавливает чтение каждой строки).Аналогично, вы можете использовать gets() вместо scanf() для чтения пользовательского ввода, если ввод представляет собой просто строку, за которой следует return (новая строка).

Все, что вам нужно знать о stdio.h

0 голосов
/ 26 марта 2012

Ваш начальный scanf() в цикле читает все до EOF, так что ничего не осталось для «Какого слова вы хотели бы найти?»scanf() для чтения.

Одним из способов решения этой проблемы является чтение начальных имен из файла (fopen(), fscanf(), fclose() - и имя файла может быть аргументом для программыили фиксированное имя).

Другой способ, которым вы можете попробовать, - это clearerr(stdin); перед словом "Что слово" scanf().Это (clearerr()) сбрасывает бит EOF и позволяет scanf() повторить попытку.Это может работать, если вход программы - терминал;это не поможет, если ввод программы происходит из файла.


int main(int argc, char **argv)
{
    char names[320][30];
    char str[30];  
    int i, j;
    char *key;
    int numOfWords;
    char userWord[30];
    Set set1, set2, set3;
    FILE *fp;

    if (argc != 2)
    {
        fprintf(stderr, "Usage: %s word-file\n", argv[0]);
        exit(1);
    }

    if ((fp = fopen(argv[1], "r")) == 0)
    {
        fprintf(stderr, "Usage: %s word-file\n", argv[0]);
        exit(1);
    }

    //scan each char string into array names
    for (i = 0; i < 320 && fscanf(fp, "%29s", str) != EOF; i++)
    {
        strcpy(names[i], str);
    }

    fclose(fp);

    //set number of words in file
    numOfWords = i;

Это настаивает на том, что вы используете ./a.out example.dat (вместо ./a.out < example.dat).Затем он будет работать более или менее так, как вы хотите.Конечно, код для чтения файла должен быть в функции, которой передаются имя файла, массив и размер массива.Значение 320 в цикле защищено от переполнения и должно быть перечислением enum { MAX_WORDS = 320 };, которое используется как в объявлении массива, так и в цикле.29 - защита от переполнения;это трудно параметризировать, но оно на единицу меньше второго измерения массива.

...