Сканирование в более чем одно слово в C - PullRequest
0 голосов
/ 10 марта 2012

Я пытаюсь создать программу, которая требует сканирования более чем в одном слове, и я не знаю, как это сделать с неопределенной длиной. Моим первым портом вызова был scanf, однако он сканировал только одно слово (я знаю, что вы можете выполнить scanf ("% d% s", temp, временный); но я не знаю, сколько слов ему нужно), поэтому я осмотрелся и обнаружил фэгеты. Одна проблема с этим, я не могу найти, как заставить его перейти к следующему коду, например

scanf("%99s",temp);
printf("\n%s",temp);
if (strcmp(temp,"edit") == 0) {
  editloader();
}

будет запускать editloader (), а:

fgets(temp,99,stdin);
while(fgets(temporary,sizeof(temporary),stdin))
    {
        sprintf(temp,"%s\n%s",temp,temporary);
    }   
if (strcmp(temp,"Hi There")==0) {
  editloader();
}

не будет перемещаться на код strcmp () и будет придерживаться исходного цикла. Что мне делать вместо этого?

Ответы [ 3 ]

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

возможно, вы можете использовать метод getline .... Я использовал его в vc ++, но если он существует и в стандартной библиотеке c, тогда вам стоит проверить здесь http://www.daniweb.com/software-development/c/threads/253585 http://www.cplusplus.com/reference/iostream/istream/getline/

Надеюсь, вынайти то, что вы ищете

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

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

#include <stdio.h>
void getargcargvfromstdin(){
char s[255], **av = (char **)malloc(255 * sizeof(char *));
unsigned char i, pos, ac;
    for(i = 0; i < 255; i++)
        av[i] = (char *)malloc(255 * sizeof(char));
enum quotes_t{QUOTED=0,UNQUOTED}quotes=UNQUOTED;

while (fgets(s,255,stdin)){

i=0;pos=0;ac=0;
while (i<strlen(s)) {
    /* '!'=33, 'ÿ'=-1, '¡'=-95 outside of these are non-printables */
    if ( quotes && ((s[i] < 33) && (s[i] > -1) || (s[i] < -95))){ 
        av[ac][pos] = '\0';
        if (av[ac][0] != '\0')  ac++;
        pos = 0;
    }else{
        if (s[i]=='"'){  /* support quoted strings */
            if (pos==0){
                quotes=QUOTED;
            }else{      /* support \" within strings */
                if (s[i-1]=='\\'){
                    av[ac][pos-1] = '"';
                }else{  /* end of quoted string */
                    quotes=UNQUOTED;
                }
            }
        }else{          /* printable ascii characters */
            av[ac][pos] = s[i];
            pos++;
        }
    }
    i++;
}

//your code here ac is the number of words and av is the array of words
}
}
0 голосов
/ 10 марта 2012

Я бы сканировал в каждом цикле слово с помощью scanf (), а затем копировал бы его с помощью strcpy () в строке "main".

...