Чтение списка символов и сохранение в массиве

0

У меня возникают проблемы со следующим кодом, и я не могу понять, почему из цикла не печатается. С помощью этого кода я хочу, чтобы программа игнорировала любые пробелы, введенные пользователем, и после ввода пробела ранее введенный номер хранится в местоположении массива. Как и это, я хочу, чтобы 6 и 78 сохранялись в 2 местах массива, а не хранили их отдельно как 6 7 8.

Это мой код:

while ((in=getchar()) != '0')
{
    if (in == ' ')
    {
        printf("space\n ");
        continue;
    }
    else
    {
        printf("assigning\n ");
        input[i]=in;
    }
    i++;
}
printf("Out of Loop");

Мой вывод при вводе 5 6 78: присваивание пространства, назначающего пространство, назначающее назначение присвоения

С этим выходом я сомневаюсь, что 78 хранится в одном месте памяти.

Я был бы очень признателен за вашу помощь, спасибо

  • 1
    Потому что вы никогда не вводите ноль во входной поток. Если вы введете «1 2 0» в вашу программу, то она должна вывести «назначение пространства, назначение пространства вне цикла»
  • 0
    Пожалуйста, предоставьте SSCE, чтобы мы могли понять, каково ваше намерение. Прямо сейчас вы храните отдельные символы, и таким образом вы никогда не сохраните строку «78».
Показать ещё 1 комментарий
Теги:

3 ответа

2

C++:

std::vector<int> v;
std::string s;
int i;

std::getline( std::cin, s);         // read full line with whitespaces
std::istringstream iss( s);         // prepare to process the line
while( iss >> i) v.push_back( i);   // read into i and push into vector if 
                                    // operator>> was successful

C:

int array[ 10];
int i = 0, retval;

while( i < 10 && ( retval = scanf( "%d", &array[ i++])) == 1) ; 

if( i == 10) {
    // array full
}

if( retval == 0) {
    // read value not an integer. matching failure
}

if( retval == EOF) {
    // end of file reached or a read error occurred
}
  • 1
    Если он не хочет ответа на С ++, он не должен помечать свой вопрос с помощью С ++.
  • 0
    Добавлена C версия
0

Прежде всего, я очень сомневаюсь, что ваш цикл while никогда не закончится, даже если вы сделали это с '\0', потому что вы используете переменную char для хранения ввода. Не строки, Только строки используют '\0' в конце, Как мы можем ввести '\ 0' с клавиатуры..???. даже если вы хотите сохранить его как '0', вам нужно было бы ввести 0 в качестве последнего номера, чтобы закончить цикл (который, я думаю, вы этого не хотите).

Таким образом, решение таково: -

После ввода чисел вы нажмете клавишу ENTER, которая будет генерировать символ новой строки '\n', поэтому вам нужно проверить новый символ строки ('\n'). И поскольку вы используете функцию getchar(), она вернет EOF ( -1) в конце ввода, поэтому важно проверить его тоже. Итак, вы должны проверить как "\n", так и EOF сразу во время цикла. Наконец, вы также должны проверить номер индекса массива ( он должен быть меньше 1), в котором вы храните цифры.

Я приложил некоторые усилия, чтобы вы поняли программу в комментариях.

int main()
{
  int i=0;
  int input[10]={0}; //here only 10 integers can be entered(hence i should be i<10)
  int in;     //To store input character
  int num=0;  //To store number which is converted from character.
  int new=1;  //To check if new number is started 0=false 1=True.
  int count=0;//This is just to know how many numbers entered,also used to print numbers at end.

  while ((in=getchar()) != '\n' && (in!=EOF) && i<10)//should check for both '\n' and EOF and array index also
  {
      if (in == ' ')
      {
         printf("space\n ");
         if(new==0) //if new Number is not started yet.
         {
            new=1;  //Start of a New number.(a number entered after space)
            i++;  //As new number is started it should be stored in new array index.
         }
         continue; //if space is entered just go to begining
      }
      else
      {
         printf("assigning\n ");
         num=in-48;  //converts a character to number (ex:- converts '3' to 3)
         input[i]=(input[i]*10)+num;  //storing the number..This is important do a paper work to understand this step.
         new=0;  //still in same number(we are still processing same number)
      }
  }
  printf("Out of Loop \n");

  count=i+1;  //This gives correct count of numbers entered

  for(i=0;i<count;i++)  //to print numbers.
     printf("%d ",input[i]);
return 0;
}

ВЫВОД:-

E:> Example.exe

78 2 65 998 1

назначение

назначение

пространство

назначение

пространство

,

,

,

пространство

назначение

Вне цикла

78 2 65 998 1

0

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

Вы можете хранить целые числа, как это (расширение кода):

bool currentNumberStarted = false;
int currentNumber = 0;
int idx = 0;
while ((in=getchar()) != '0')// you probably want '\0' instead of '0'
{
    if (in == ' ')
    {
                    if (currentNumberStarted)
                    {
                        input[idx]=currentNumber;
                        idx++;
                        currentNumberStarted = false;
                    }
        printf("space\n ");
        continue;
    }
    else
    {
        printf("assigning\n ");
                    currentNumberStarted = true;
                    currentNumber *= 10;
        currentNumber += in;
    }
}
printf("Out of Loop");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню