Προς το περιεχόμενο

Διάβασμα αριθμών μέχρι να βρεθεί \n στην C


sotosko

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

προσπαθώ να φτιάξω ένα πρόγραμμα σε C το οποίο να ζητάει από το χρήστη να δώσει τα στοιχεία ενός πίνακα Α ακεραίων αλλά ο χρήστης να μπορεί να δώσει

οποιοδήποτε αριθμό ακεραίων επιθυμεί.

 

Αυτό που έχω σκεφτεί είναι να διαβάζω αριθμούς με scanf μέσα σε ένα while loop και όταν ανιχνεύσω newline (\n) να κάνω brake; το loop.

 

Ο κώδικάς μου μέχρι τώρα είναι:

>#include<stdio.h>
#include<stdlib.h>
#define MAX_NUMS 1000 // maximum allowed input number

int* readnumbers(void)
{
int i,j,*array;
       /* Create an array of integers with the numbers taken from the user*/
printf("Please enter the numbers:");
array=(int*)malloc(sizeof(int));

for(i=0; i<MAX_NUMS; i++)
{
	scanf("%d", &array[i]);
	realloc(array,sizeof(int)*(i+2));
	if(array[i]=='\n')
		break;
	fflush(stdin);
}
       /* Printing the array*/
for(j=0;j<i;j++)
	printf("%d " ,array[j]);

return array;
}

void main(void)
{
int *numbers;
numbers=readnumbers();

       printf("\n\n");
system("pause");
}

 

Το πρόβλημα μου είναι ότι δεν μπορώ να το κάνω να σταματήσει την εισαγωγή αριθμών όταν εκεί που ζητάει αριθμό απλά πατήσω enter. Πώς μπορώ να το κάνω αυτό;

 

Ευχαριστώ προκαταβολικά

Δημοσ.

Ο πίνακας σου είναι τύπου Integer οπότε προφανώς δεν μπορεί μέσα στον πίνακα να υπάρχουν συμβολοσειρές όπως είναι η "\n". Ως συνέπεια έτσι όπως είναι ο κώδικας δεν θα φτάσει ποτέ στο break. Θα μπορούσες να διάβαζες την είσοδο ως συμβολοσειρα (char) και ύστερα αν δεν ήταν ο χαρακτήρας αλλαγής γραμμής να έκανες την μετατροπή απο char σε int.

 

Επίσης η χρήση της realloc δεν είναι αποδοτική έτσι όπως την έχεις κάνει. Σκέψου οτι κάθε φορά που κάνεις realloc αντιγράφει τα περιεχόμενα σε ένα άλλο χώρο μνήμης και σβήνει τον παλιό χώρο.

Δημοσ.

 

 

Το πρόβλημα μου είναι ότι δεν μπορώ να το κάνω να σταματήσει την εισαγωγή αριθμών όταν εκεί που ζητάει αριθμό απλά πατήσω enter. Πώς μπορώ να το κάνω αυτό;

 

Ευχαριστώ προκαταβολικά

 

>
int c;
int wasNumber = 1;

while ( ( (c = getchar()) != '\n') && wasNumber){
 wasNumber = append(c);
}

int append(char c){
 if (isalpha(c)){//μπορεί να θέλει !isdigit(c) δες το. Το ίδο και στον άλλο κώδικα.. δυστυχώς δεν θυμάμαι απέξω  
   //ean thes vale minima poy na leei oti epitreponte mono arithmoi
   return 0;
 } else {
   //vaze ston pinaka
   return 1;
 }
}

 

Όμως!!!

Εγώ θα το υλοποιούσα με ουρά και αφού τελείωνε το "μάζεμα" των στοιχείων θα δέσμευα ΜΙΑ ΦΟΡΑ μνήμη για πίνακα και θα έβαζα τα στοιχεία μου στον πίνακα (κάνοντας dequeue από την ουρά). Έτσι, δεν θα είχα τα realloc.

 

Έτσι, εάν το κάνεις με ουρά μπορείς να έχεις:

 

>

Queue* myQueue;
myQueue = (Queue*) malloc( sizeof(Queue) );


int c;
int wasNumber = 1;

while (wasNumber){

 printf("Type the number\n");
 
 while ( ( (c = getchar()) != '\n') && wasNumber){
   wasNumber = append(c);
 }

 if (!wasNumber){
   printf("Want to type again the number and use only numbers? (press 1 for YES, 0 for NO): ");
   scanf("%d",&wasNumber);
   printf("\n");
 }  

}

int append(char c){
 if (isalpha(c)){
   printf("Only numbers allowed\n");
   return 0;
 } else {
   append(&myQueue, c);
   return 1;
 }
}

 

 

/edit

Ο παραπάνω κώδικας είναι "στο πόδι". Απλά να πάρεις την ιδέα. Δεν ξέρω εάν κάνει ακόμα και compile όπως τον έχω γράψει :P /edit

Δημοσ.

Καταρχάς σας ευχαριστώ πολύ και τους δύο για την απάντησή σας.

 

Θα μπορούσες να διάβαζες την είσοδο ως συμβολοσειρα (char) και ύστερα αν δεν ήταν ο χαρακτήρας αλλαγής γραμμής να έκανες την μετατροπή απο char σε int.

 

@Technology fan: Αν το κάνω με string (συμβολοσειρά) θα πρέπει αναγκαστικά το κάθε στοιχείο του πίνακα να είναι μονοψήφιος αριθμός, έτσι; Επειδή αν για παράδειγμα θέλω να βάλω στον πίνακα το 45 και το 3 θα γράψω "453" θα πατήσω enter αλλά θα το δεχτεί ως τρία διαφορετικά στοιχεία το 4, το 5 και το 3.

 

 

Εγώ θα το υλοποιούσα με ουρά και αφού τελείωνε το "μάζεμα" των στοιχείων θα δέσμευα ΜΙΑ ΦΟΡΑ μνήμη για πίνακα και θα έβαζα τα στοιχεία μου στον πίνακα (κάνοντας dequeue από την ουρά). Έτσι, δεν θα είχα τα realloc.

 

@Timonkaipumpa: Δεν λέω, οι ουρές είναι πολύ χρήσιμες αλλά δεν είναι μέσα στην ύλη την οποία μπορώ να χρησιμοποιήσω για να λύσω την άσκηση, άσε που δεν έχω ασχοληθεί και διεξοδικά μαζί τους με αποτέλεσμα να μην τις γνωρίζω και τόσο καλά.

 

Υ.Γ. Δοκιμάζω τώρα τον πρώτο τρόπο του Timonkaipumpa και βρήκα και άλλο πρόβλημα που προκύπτει. Εκτός από το ότι είναι αδύνατο να βάλω στον πίνακα αριθμούς με περισσότερα από ένα ψηφία επίσης δεν μπορώ να βάλω αρνητικούς αριθμούς...

Δημοσ.

Δες ένα παράδειγμα

 

>int main(int argc, char** argv) {

char number[40]; // kai pollous ebala panw apo ton 2147483647 den tha ftaseis
int anInt;

printf("grapse arithmo kai tha sto piasw  \n");

gets(number);
if (number[0] == '\0')
   	printf("den ebales tpt\n");
else {
   	printf("egrapses %s\n", number);
   	anInt = atoi(number); // metatropi apo char se int
   	printf("Twra ton exw san arithmo kai gia na sto apodeiksw tou prosthetw kai ena  \n%d \n", anInt + 1);
}


return 0;
}



Δημοσ.

Δες ένα παράδειγμα

 

Ευχαριστώ πολύ, το παράδειγμά σου με βοήθησε πολύ!

Αυτό που έκανα λάθος ήταν ότι πίστευα ότι θα διάβαζα όλα τα νούμερα μαζί και όχι ένα ένα. Αλλά τελικά το ένα ένα είναι πολύ πιο εύκολο και λογικό.

Δημοσ.

Ευχαριστώ πολύ, το παράδειγμά σου με βοήθησε πολύ!

Αυτό που έκανα λάθος ήταν ότι πίστευα ότι θα διάβαζα όλα τα νούμερα μαζί και όχι ένα ένα. Αλλά τελικά το ένα ένα είναι πολύ πιο εύκολο και λογικό.

 

 

με το

 

while ( (c = getchar()) != '\n' )

 

μπορείς να διαβάσεις όλα τα νούμερα μαζί μέχρι να έρθει new line .

 

Όταν έλεγα ότι δεν τρέχει ο κώδικας... εννοούσα μικρές λεπτομέρειες (και σαφώς και τις

συναρτήσεις που δεν είχα ορίσει).

 

Δοκίμασε το while που σου είπα και θα δεις ότι μπορείς να διαβάσεις όλα τα νούμερα μαζί.

Δημοσ.

με το

 

while ( (c = getchar()) != '\n' )

 

μπορείς να διαβάσεις όλα τα νούμερα μαζί μέχρι να έρθει new line .

 

Όταν έλεγα ότι δεν τρέχει ο κώδικας... εννοούσα μικρές λεπτομέρειες (και σαφώς και τις

συναρτήσεις που δεν είχα ορίσει).

 

Δοκίμασε το while που σου είπα και θα δεις ότι μπορείς να διαβάσεις όλα τα νούμερα μαζί.

 

Καταρχάς ευχαριστώ.

Απλά με αυτό τον τρόπο δεν μπορείς να διαβάσεις ένα αρνητικό ή έναν αριθμό με >2 ψηφία.

Τέλοσπάντων βρήκα τρόπο να το κάνω. Απλά ρωτάω στην αρχή το πλήθος των αριθμών από τον χρήστη και μετά τους διαβάζω έναν έναν

Δημοσ.

Δεν χρειάζεται να ζητάς το πλήθος των αριθμών. κάντο έτσι όπως το χεις με ένα while και πρόσθεσέ τα σ ενα πίνακα. Για την realloc μπορείς να προσθέτεις 10 θέσεις επιπλέον κάθε φορά οπου δε "χωράνε" οι αριθμοί. Το 10 είναι τυχαίο, Όσο πιό μεγάλο είναι το νούμερο τόσο γρηγορότερο αλλα και τόσο μεγαλύτερη πιθανότητα υπάρχει να σπαταλήσεις χώρο, όσο πιό μικρό είναι τόσο πιο αργό είναι αλλά μικρή πιθανότητα για σπατάλη...

Δημοσ.

Καταρχάς ευχαριστώ.

Απλά με αυτό τον τρόπο δεν μπορείς να διαβάσεις ένα αρνητικό ή έναν αριθμό με >2 ψηφία.

Τέλοσπάντων βρήκα τρόπο να το κάνω. Απλά ρωτάω στην αρχή το πλήθος των αριθμών από τον χρήστη και μετά τους διαβάζω έναν έναν

 

 

Έτσι όπως είναι με το while, μπορείς να αποθηκεύσεις όλη την είσοδο από το πληκτρολόγιο όπου θες (για αυτό πρότεινα ουρά).

 

Μετά, μπορείς να "ξεδιαλέξεις" τους αριθμούς ακόμα και τους αρνητικούς.

Δημοσ.

Δεν χρειάζεται να ζητάς το πλήθος των αριθμών. κάντο έτσι όπως το χεις με ένα while και πρόσθεσέ τα σ ενα πίνακα. Για την realloc μπορείς να προσθέτεις 10 θέσεις επιπλέον κάθε φορά οπου δε "χωράνε" οι αριθμοί. Το 10 είναι τυχαίο, Όσο πιό μεγάλο είναι το νούμερο τόσο γρηγορότερο αλλα και τόσο μεγαλύτερη πιθανότητα υπάρχει να σπαταλήσεις χώρο, όσο πιό μικρό είναι τόσο πιο αργό είναι αλλά μικρή πιθανότητα για σπατάλη...

Και ποια θα είναι η συνθήκη τερματισμού της while;

 

Έτσι όπως είναι με το while, μπορείς να αποθηκεύσεις όλη την είσοδο από το πληκτρολόγιο όπου θες (για αυτό πρότεινα ουρά).

 

Μετά, μπορείς να "ξεδιαλέξεις" τους αριθμούς ακόμα και τους αρνητικούς.

Ναι αλλά πώς θα διαλέξω μετά τους αριθμούς αν κάθε φορά είναι τυχαίοι και διαφορετικοί;

Δημοσ.

Και ποια θα είναι η συνθήκη τερματισμού της while;

 

 

Ναι αλλά πώς θα διαλέξω μετά τους αριθμούς αν κάθε φορά είναι τυχαίοι και διαφορετικοί;

 

 

 

Πώς θα δίνει τους αριθμούς ο χρήστης; Δεν θα τους διαχωρίζει με κόμμα ή με κενό; Στην ουρά που θα χρησιμοποιήσεις, θα κάνεις dequeue και να βρίσκεις τον αριθμό (θα ομαδοποιείς τους χαρακτήρες που απαρτίζουν τον αριθμό) μέχρι να συναντήσεις πάλι κενό όπου θα το κάνεις dequeue και τα το "πετάς".

 

 

 

 

Υ.Γ. Επίσης... για να είναι πιο σωστό θα πρέπει να έχεις και συνθήκη c != EOF στο while.

Δημοσ.

Και ποια θα είναι η συνθήκη τερματισμού της while;

 

Όταν εισαχθεί χαρακτήρας \n όπως λέει και το post.

 

Πώς θα δίνει τους αριθμούς ο χρήστης; Δεν θα τους διαχωρίζει με κόμμα ή με κενό; Στην ουρά που θα χρησιμοποιήσεις, θα κάνεις dequeue και να βρίσκεις τον αριθμό (θα ομαδοποιείς τους χαρακτήρες που απαρτίζουν τον αριθμό) μέχρι να συναντήσεις πάλι κενό όπου θα το κάνεις dequeue και τα το "πετάς".

 

 

Υ.Γ. Επίσης... για να είναι πιο σωστό θα πρέπει να έχεις και συνθήκη c != EOF στο while.

 

Σου είπε οτι δεν έχει διδαχτεί ουρές, φυσικά είναι πολύ πιο "όμορφος" ο τρόπος με την ουρά αλλα είναι και πιο δύσκολο και στην συγκεκριμένη περίπτωση δεν αξίζει...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...