Установите переменные с помощью fgetc (stdin)

Я пытаюсь установить переменные, используя fgetc() из stdin.

Вот мой код,

#include <stdio.h>

int main(void){
    int ch;
    int firstNumber,secondNumber;
    char str;

    printf("Enter two numbers and a string: ");
    while((ch=fgetc(stdin))!='\n'){
        while(ch != ' '){
            firstNumber = ch;
            secondNumber = ch;
            string = ch;
            }
        }
    printf("%d %d %s",firstNumber,secondNumber,string);
    return 0;
}

Поэтому, если я наберу 2 2 string (между символами есть пробел)

Я хочу, чтобы переменная firstNumber была 2

и secondNumber быть 2

и str быть string


person CbeginnerXO    schedule 18.08.2015    source источник
comment
Вы читаете символы в ASCII. Вы должны преобразовать символы в числа. Попробуйте firstNumber = atoi(ch); Вы читаете символы по одному, поэтому для многозначных чисел это не сработает.   -  person Paul Ogilvie    schedule 18.08.2015
comment
scanf больше подходит для вашей задачи.   -  person Yu Hao    schedule 18.08.2015
comment
while (ch! = '') условие перейдет в бесконечный цикл, если вы укажете непространственный символ :(   -  person BEPP    schedule 18.08.2015


Ответы (3)


Вот возможный подход:

  1. Вы можете сначала проанализировать всю строку и сохранить ее во временном буфере.
  2. Теперь вы можете использовать strtok() для токенизации строки с помощью символа ' '(space). В качестве альтернативы вы можете использовать sscanf() вместо strtok().
  3. Используйте atoi() для первых двух чисел и прочтите последнюю строку.

Код:

Предполагается, что буфер, необходимый для хранения отсканированной строки, не превышает 100 байтов.

Подход с использованием strtok():

int main()
{
    int ch,i=0;
    int firstNumber,secondNumber;
    const char seperator[2] = " -";
    char buffer[100];
    char *string;

    printf("Enter two numbers and a string: ");
    while((ch=fgetc(stdin))!='\n'){
        buff[i++]=ch;
    }

    /* get the first token as a number */
    firstNumber = atoi(strtok(buff, seperator));
    printf("%d\n",firstNumber);

    /* get the second token as a number*/   
    secondNumber = atoi(strtok(NULL, seperator));    
    printf("%d\n",secondNumber);

    /* get the third token as a string */
    string=strtok(NULL, seperator);
    printf("%s\n",string);

    return(0);
}

Подход с использованием sscanf():

printf("Enter two numbers and a string: ");
while((ch=fgetc(stdin))!='\n'){
    buff[i++]=ch;
}

sscanf(buff, "%d %d %s", &firstNumber, &secondNumber, string);  
printf("%d\n%d\n%s\n", firstNumber, secondNumber, string);
person TryinHard    schedule 18.08.2015

Я думаю, ваше решение должно быть:

#include <stdio.h>

int main(void){
    int ch;
    int firstNumber=0,secondNumber=0,b=0;
    char str;

    printf("Enter two numbers and a string: ");
    while((ch=fgetc(stdin))!='\n'){
        if (ch != ' '){
            if (b==0)
                 firstNumber = firstnumber*10 + ch-'0';
            else
            if (b==1)
                secondNumber = secondnumber*10 + ch-'0';
            else
                str = ch;
        }
        else b++;
    }
    printf("%d %d %c",firstNumber,secondNumber,str);
    return 0;
}

Обратите внимание, что b отслеживает то, что вы назначили, и что для вывода str, который на самом деле всего один символ, вам нужно использовать %c. Кроме того, нет переменной string, которую вы хотите распечатать, только str.

person Paul Ogilvie    schedule 18.08.2015
comment
atoi принимает строку с завершающим нулем, передача одного целого числа - это UB . - person Kninnug; 18.08.2015
comment
что, если числа больше, чем цифры, например: 22 234? в этом случае ch-'0 'терпит неудачу - person TryinHard; 18.08.2015
comment
@TryinHard, однозначные цифры - это то, что спросил ОП. Воспринимайте это как демонстрацию для него / нее, чтобы выучить основы. - person Paul Ogilvie; 18.08.2015
comment
Эй, OP упомянул два числа, а не двухзначные числа - person TryinHard; 18.08.2015
comment
@TryinHard, исправил. Только не исправлена ​​строка, которая остается единственным символом, который перезаписывается, если их больше одного. Потребуется буфер потенциально неограниченного размера, и я не буду вдаваться в эту проблему - оставьте что-нибудь для него / нее. - person Paul Ogilvie; 18.08.2015

Нет необходимости в strtok, мы можем добиться того же здесь, в sscanf;

#include <stdio.h>
#include <stdlib.h>

int main()
{
      int firstNumber,secondNumber;
      char str[100];
      char buffer[100];

      printf("Enter two numbers and a string: ");
      fgets(buffer, 1024, stdin);

      sscanf(buffer, "%d %d %s", &firstNumber, &secondNumber, str);
      printf("%d %d %s\n",firstNumber,secondNumber,str);

      return(0);
}

Выход

root@viswesn-vm:/var/lib/lxc# ./a.out 

Enter two numbers and a string: 2 234 king

2 234 king
person Viswesn    schedule 18.08.2015