Wczytywanie wartosci do petli

0

Witam, tworze program, w jezyku C, gdzie chce wprowadzic wartosci do tablicy. Wszystko dziala dobrze, poza jedna rzeczą: po wprowadzeniu pierwszej wartosci petla nie wykonuje sie, tylko czeka na druga wartosc (ktora jest de facto drugim elementem tablicy), po czym wszystko idzie gladko, a ostatni element wpisany nie jest w ogole do tablicy zapisywany. Dlaczego tak się dzieję, że po wpisaniu pierwszej wartości, pętla się nie wykonuje?
Oto kod:

#include <stdio.h>
#include <conio.h>

int main()
{
  int pesel[11] = { -1 };
  int sum;    
  int i = 0;
  printf("Podaj 11-cyfrowy numer PESEL klikajac spacje po kazdej cyfrze\n");
  do
  {
      printf("Podaj %d element tablicy: ", i+1);
      scanf_s("%d\n", &pesel[i]);
      i++;
  } while (i < 11);
  

  sum = pesel[0] + pesel[1] * 3 + pesel[2] * 7 + pesel[3] * 9 + pesel[4] * 1 + pesel[5] * 3 + pesel[6] * 7 + pesel[7] * 9 + pesel[8] * 1 + pesel[9] * 3 + pesel[10] * 1;
  printf("Suma=%d", sum);

  return 0;
}
0

Nie wiem dlaczego tak się dzieje, pewnie coś zawiesza się przy tłumaczeniu inputu, może coś się nie flushuje.
Rozwiązaniem tego problemu może być takie wczytywanie:

    char line[256];
    int pesel[11];
    int sum;
    int i = 0;
    int is_num;
    printf("Podaj 11-cyfrowy numer PESEL klikajac spacje po kazdej cyfrze\n");
    for(i=0;i<11;++i){
        printf("Podaj %d element tablicy: ", i+1);
        fgets(line,sizeof line,stdin);
        is_num = sscanf(line,"%d\n", &pesel[i]);
        if(!is_num){
            --i;
            continue;
        }
    }

    for(i=0;i<11;++i)
        printf("pesel[%d] = %d\n",i+1,pesel[i]);

0
#include <stdio.h>
#include <string.h>

int main()
{
	const int mul[4]={9,7,3,1};
	char pesel[13];
	for(;!feof(stdin);printf("\n"))
	{
		printf("Podaj pesel: ");
		if(scanf("%12s",pesel)!=1) printf("Nie udalo sie wczytac\n");
		else if(strlen(pesel)!=11) printf("Ma byc 11 znakow\n");
		else
		{
			int sum=('0'-pesel[10]);
			for(int i=0;i<10;++i) sum+=(pesel[i]-'0')*mul[i&3];
			if(sum%10) printf("Nie poprawny PESEL\n");
			else printf("PESEL jest poprawny\n");
		}
	}
	return 0;
}
1

Usuń ten enter, tzn zamień

      scanf_s("%d\n", &pesel[i]);

na

      scanf_s("%d", &pesel[i]);
0
dakwather napisał(a):

Dlaczego tak się dzieję, że po wpisaniu pierwszej wartości, pętla się nie wykonuje?

Dokumentacja scanf mów:
std::scanf, std::fscanf, std::sscanf - cppreference.com

  • whitespace characters: any single whitespace character in the format string consumes all available consecutive whitespace characters from the input (determined as if by calling isspace in a loop). Note that there is no difference between "\n", " ", "\t\t", or other whitespace in the format string.

Czyli skoro twój scanf wygląda tak: scanf_s("%d\n", &pesel[i]); to znak \n próbuje skonsumować tak dużo białych znaków jak to możliwe.
Ergo po wczytaniu wartości scanf czyta dalej białe znaki, w tym "enter" który nacisnąłeś i dalej próbuje, prze co scanf czeka na wprowadzanie następnej linii (wtedy się okaże czy dalej są białe znaki, czy coś innego).

1 użytkowników online, w tym zalogowanych: 0, gości: 1