Сканирование более чем одним словом в C

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

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() и останется в исходном цикле. Что мне делать вместо этого?


person user1150512    schedule 10.03.2012    source источник
comment
Я настоятельно рекомендую использовать функцию POSIX 2008 getline, а затем работать с каждой строкой целиком.   -  person Basile Starynkevitch    schedule 10.03.2012


Ответы (4)


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

person codor    schedule 10.03.2012
comment
Единственная проблема заключается в том, что если бы у меня был цикл, мне нужно было бы знать, сколько слов можно ввести. - person user1150512; 10.03.2012
comment
fgets(temp,99,stdin); while(fgets(temporary,sizeof(temporary),stdin)&&(strcmp(temp,"Hi There")!=0)) { sprintf(temp,"%s\n%s",temp,temporary); } editloader(); Таким образом, вы проверяете условие цикла while, есть ли входные данные, и если Hi там еще нет. затем - person codor; 11.03.2012

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

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

person Nav    schedule 11.03.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
}
}
person technosaurus    schedule 11.03.2012

Если он превышает размер буфера, вы просто не сможете этого сделать.
Вам придется выполнить несколько циклов.

максимальный размер, который вы можете отсканировать с помощью scanf(), будет исходить из

char *name; 
scanf("%s",name);

прочти это

http://sekrit.de/webdocs/c/beginners-guide-away-from-scanf.html

person Ernest Molner    schedule 14.10.2020