Есть ли способ прочитать c-строку, а затем int с единственным scanf в C? - PullRequest
5 голосов
/ 31 января 2011

Эй, я пытаюсь получить эту функцию, чтобы получить следующий вывод с указанным входом, "..." - это то, где я не уверен, что написать:

void Question8(void)
{
  char sentence[100];    
  int grade;    
  scanf(….);    
  printf("%s %d", sentence, grade);    
}

Input:
My CS Grade is 1000

Output:
My CS Grade is 100

ОднакоКикер в том, что мне нужен scanf для чтения c-строки, а затем int с одной командой scanf, это вообще возможно?

Редактировать: я могу редактировать код только в той локациис этими тремя периодами («...») я не могу больше ничего использовать.Я могу предположить, что входные данные являются ожидаемыми, но я не могу ничего изменить за пределами трех периодов.Вывод не содержит опечаток, целью этого назначения является использование флагов и escape-последовательностей.

Ответы [ 4 ]

2 голосов
/ 31 января 2011

Считать предварительно отформатированную строку можно с помощью scanf, однако формат должен быть строгим. Эта версия будет продолжать читать входные данные, пока не встретится цифра, а затем прочитать целое число. Вот ваш код снова:

  char sentence[100];
  int grade;
  scanf("%[^0-9] %d",sentence,&grade);
  printf("%s %d\n", sentence, grade);
2 голосов
/ 31 января 2011

Я покончу с этим быстро:

<obligatory_rant>
    stupid question, but I guess it's homework and you're
    stuck with these absurd limitations
</obligatory_rant>

Тогда, если вам нужно прочитать все до, кроме первой цифры, то число:

if (scanf("%100[^0-9] %3d", text, &number) == 2)
    ...

Примечания:

  • 100 в "%100[... должен соответствовать фактическому размеру буфера для защиты от переполнения буфера.
  • %3d документирует, что самое большее 3 цифры должны принимать числовое значение, поэтому 1000 правильно читается как 100.
  • [^...] означает строку, состоящую из символов, отличных от («^») в следующем наборе, который затем задается как 0-9 - цифры.
  • if (... == 2) проверяет, были ли оба позиционных параметра успешно отсканированы / преобразованы.

Если вы не можете добавить if и сообщение об ошибке, просто:

scanf("%100[^0-9] %3d", text, &number)
1 голос
/ 31 января 2011

Протестировано в Visual Studio 2008

#include <stdio.h>

    int main()
    {
      char sentence[100];    
      int grade = 0;    
      scanf("%[^0-9] %d",sentence,&grade);
      printf("%s %d", sentence, grade);   
      return 1;
    }


Input : 
My CS Grade is 100
Output :
My CS Grade is 100
0 голосов
/ 31 января 2011

Это действительно ужасный вопрос.Правильный набор параметров scanf будет "%14c%3d", sentence, &grade

Поскольку в оператор printf включен пробел, конечный пробел не должен храниться в предложении.Поскольку вход содержит другие пробелы, нет другого решения (о чем я могу думать), кроме фиксированной длины.Целочисленный синтаксический анализ также требует фиксированной длины для усечения 1000 до 100.

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

...