C - Программа завершается без сканирования? - PullRequest
1 голос
/ 26 ноября 2011

Не совсем уверен, что здесь происходит, просто я дурак или что-то странное с компилятором.

Приведенный ниже код должен после вызова моей функции searchList принимать ввод от пользователя, но вместо этогопрограмма просто прекращает работу, даже не вызывает ошибки, она буквально заканчивается.Что-то глупое?

РЕДАКТИРОВАТЬ: searchNode это searchList, простите за опечатку.

Cheers.

typedef struct List {
 char c;
 struct List *next;
}List;

List* insertNode(char c, List* t1);
List* addNode(void);
List* searchList(List *t1);

int main(void) {
  List *z = addNode();
  List *search_result;
  char s;
   while ( z != NULL) {
    printf("%c", z->c);
    z = z->next;
  }
  search_result = searchList(z);
return 0;
}

List *addNode(void) {
 List *head = (List*)calloc(1,sizeof(List));
 char c;
 while (( c = getchar()) != '.') {
  head = insertNode(c, head);
 }
 return head;
}

List *insertNode(char c, List* t1) {
 List *tail = (List*)calloc(1,sizeof(List));
 tail->c = c;
 tail->next = t1;
return tail;
}

List *searchList(List *t1) {
 char c;
 printf("Please enter a search term");
 scanf("%c", &c);
  while (t1 != NULL) {
   if (t1->c == c) {
   return t1;
  }
  t1 = t1->next;
 }
return 0;
}

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

Ваша программа выполняет getchar и scanf после нее.После выполнения getchar у вас все еще есть '\n' в буфере, и вот что scanf читает.

Вы можете обойти это, читая символы из буфера, после того, как прочиталисимвол .:

while (( c = getchar()) != '.') {
    head = insertNode(c, head);
}
while (getchar() != '\n');
1 голос
/ 26 ноября 2011

Ваш звонок на searchList сделан, когда z равен NULL. Следовательно, он немедленно возвращается.

while ( z != NULL) {
    printf("%c", z->c);
    z = z->next;
}
search_result = searchList(z);

Цикл while завершается, когда z равно NULL.

Ваша основная проблема в том, что у вас недостаточно переменных. Вам необходимо сохранить переменную, указывающую на начало списка, и другую переменную, которая будет использоваться при итерации по списку.

Вы также, кажется, путаете голову и хвост. Термин tail используется для обозначения узла, для которого next равен NULL. Термин head обозначает узел на другом конце списка.

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

...