2016-10-16 4 views
0

Итак, я создаю очень базовую оболочку, которая читает материал по строкам, и у меня возникают проблемы с циклами. Это моя главная:Оболочка, которая читается по строкам

int main(int argc, char* argv[]) { 
    char* av[ARGVMAX]; 
    int nArgs, i, j, k; 

    fflush(stdout); 
    while (fgets(line, LINESIZE, stdin) != NULL && line[0] != '\n') { 
    for(i = 0; line[i] != '\n'; i++) { 
     temp[i] = line[i]; 
    } 
    scanf("%d", &nArgs); 
    j = 0; 
    while(j<nArgs) { 
     temp[i++] = ' '; 
     scanf("%c", &temp[i++]); 
     j++; 
    } 
    makeargv(temp, av); 
    runcommand(av); 
    fflush(stdout); 
    } 
return 0; 
} 

Прежде всего, то, что я пытаюсь сделать, это превратить каждую особую строку, которая считывается в одно целое, другими словами, чтение «строка» и положить его в массив, разделив каждое слово на "'.

Теперь моя проблема в том, что всякий раз, когда программа находится на «scanf» («% c», & temp [i ++]) », он не позволяет мне вводить что-либо в первый раз, что это означает, что всякий раз, когда я вхожу цикл в первый раз, когда он пропускает эту строку кода, но на других входах цикла (второй или третий раз) он ждет, чтобы я что-то написал.

Что это значит? Я делаю что-то неправильно? Спасибо заранее!

+0

Если я правильно прочитал ваш код, пользователь вводит непустую строку ввода, а затем должен ввести число - количество аргументов, N для краткости; и за числом должно следовать N одиночных символов, каждый из которых станет аргументом? Это не очень приятный интерфейс командной строки. Ваш код также не имеет защиты от переполнения буфера (что, если пользователь вводит 999999999 в качестве номера?) И т. Д. Я думаю, вам нужно снова подумать о том, что вы требуете от пользователей. И, как отмечается в ответе, '% c' будет читать новую строку после номера, или пробела, или двоеточия, или ... –

ответ

1

После линии

scanf("%d", &nArgs); 

сохраняется во входном буфере в newline, и это читается линии

scanf("%c", &temp[i++]); 

Хотя формат %d (и большинство форматов) игнорирует любые ведущие пробелы во входном буфере %c нет, если вы не ввели space:

scanf(" %c", &temp[i++]); 
// ^
+0

Теперь он работает !!! –

+0

Что делать, если вместо функции scanf я использовал функцию fgets? Он все еще делает то же самое в функции fgets, как мне заставить его работать? –

+0

'fgets' всегда читает' newline' (если присутствует, например, последняя строка в текстовом файле может не иметь 'newline'). –