2014-10-10 2 views
1

Я должен создать связанный список с каждым узлом, имеющим структуру:Чтение данных в список узлов

struct stack{ 
    char paint; 
    int index; 
    struct stack *next; 
} 
typedef struct stack s; 

Я должен создать связанный список с т узлами путем считывания м входов, таких как:

A 7 

B 2 

C 1 

D 4 .... 

поэтому я попытался использовать для цикла , как это, которое не удается, а также я попытался последовательны scanf сек как

scanf("%c",&c); 

scanf("%d",&b); 

Я также попытался это:

for(i=0;i<m;i++) 
{ 
    scanf("%c %d",&c,&b); 
    temp=(s *)malloc(sizeof(s)); 
    temp->paint=c; 
    temp->index=b; 
    temp->next=head; 
    head=temp; 
    temp=NULL; 
} 

Что я делаю неправильно? Я действительно боюсь scanf, поэтому я обычно использую getchar все время и, если возможно, объясните, как работает scanf при вводе с терминала или файлов, имеющих n строк входов. А также альтернативный оператор while((c=getchar())!='\n') с использованием scanf?

+1

Можете ли вы уточнить * ..., который терпит неудачу ... *? В противном случае? – lurker

+0

Вы действительно должны проверить результаты своих вызовов функций; в частности, убедитесь, что 'scanf' возвращает 2 (прочитайте 2 поля). И вы не читаете пробелы после каждой строки (добавьте пробел в конец строки формата). – Dmitri

+0

@lurker идет в цикл for, и ничего не происходит, все, что я вижу, - это терминал, ожидающий ввода – sarat

ответ

1

Измените ваш scanf от

scanf("%c %d",&c,&b); 

в

scanf(" %c %d",&c,&b); 
//  ^Add a space before %c 

Проблема здесь scanf читает \n После ввода значение символа и целочисленного значения, а затем нажать клавишу ввода.

Пространство до % пропустит пробел (также \n), и оно будет читать следующий символ, который не является пробелом.

+0

Большое спасибо @ 1336087, пропуская пробел, исправил проблему, я безумно искал что-то не так с кодом – sarat

+0

@sarat: Добро пожаловать :) Если ваша проблема решена, щелкайте по метке и принимайте ответ, который был полезен для вас. – user1336087

0

В зсапЕ, %c и %1s не то же самое:

  • %c читает следующий символ, какой бы она может быть пробел, символ новой строки, ...
  • %1s читает следующий печатаемый символ

В вашем случае использования, я думаю, вы должны использовать

scanf("%1s %d",&c,&b); 

, чтобы правильно пропустить возможные пробелы в новой строке