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

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

Δημοσ.

Λογικά δεν έχει σχέση η getchar() αλλά το ότι χρησιμοποιεί strcpy() αντί για strncpy().

 

Καλησπέρα.

 

Κοιτα δεν το έχω ψάξει πολυ με αυτο που λες αλλα το θεμα πιστευω ειναι οτι αυτα που παραμένουν στο buffer αν ο χρηστης δωσει μεγαλυτερη εισοδο ουσιαστικα πανε σαν εισοδος στην επομενη getchar(). Για παραδειγμα ο κωδικας

 

>

#include<stdio.h>
#include <string.h>
#define n 10
int read_line(char * , int );

int main(void)
{

char msg_str[n]={'\0'};

read_line(msg_str, n);
puts(msg_str);
read_line(msg_str, n);
puts(msg_str);

return 0;
}
int read_line(char str[] , int maxlen)
{
int ch , i =0 ;

while( (ch= getchar()) !='\n' && i<maxlen)
							  
str[i++]= ch;

str[i]='\0';

return i;
}

 

Κανει ακριβως αυτο το πραγμα.. αν του δωσεις εισοδο μεγαλυτερη απο n τοτε οτι απέμεινε παει για την επομενη κληση της getchar() .

Πιστευω οτι ακριβως αυτο ειναι το θεμα χωρις να εχω δει την strcpy .

  • Απαντ. 1,6k
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ. (επεξεργασμένο)

Καλησπερα,

 

εχω εναν πινακα kati[9][3] που τα χ πρωτα στοιχεια του ειναι !=0 και τα υπολοιπα 0.

με ποιον τροπο μπορω να βρω ποιο ειναι το πρωτο στην σειρα στοιχειο με 0 και να του αλλαξω την τιμη σε κατι διαφορο του 0?

 

ευχαριστω
υγ:παιδεψτε με λιγο,μην μου δωσετε κωδικα απευθειας

 

update:μεσα σε διπλο for loop θα κανω if(kati[j] != 0) και αν ισχυει τοτε θα αλλαζω την τιμη σε αυτο που θελω. σωστος?

Επεξ/σία από koslibpro
Δημοσ.

Διάβασα σε ένα ελληνικο βιβλιο οτι οι

char *message=".... ";
char message[]="....";

ειναι ισοδύναμες λεει.... Μα τι λέει? :P

Απόσπασμα :

------------------------------------------------

Η αρχή μιας συμβολοσειράς , οπως αναφέρθηκε προηγουμένως , δηλώνεται απο έναν δείκτη σε μια μεταβλητή τύπου char. Μπορεί να θυμάστε πως δηλώνεται ένας τέτοιος δείκτης :

char *message;

Αυτή η πρόταση δηλώνει εναν δείκτη σε μια μεταβλητή τύπου char με το ονομα message . Δεν δείχνει σε τίποτε προς το παρόν , αλλα αν αλλάζατε τη δήλωση του δείκτη στην ακόλουθη:
char *message="Hello";

η συμβολοσειρά hello (με εναν κενο χαρακτηρα τερματισμού) αποθηκεύεται κάπου στην μνήμη , και ο δείκτης message παιρνει την αρχική τιμή της διεύθυνσης του πρώτου χαρακτήρα της.Μην ανησυχείτε για την θέση αποθήκευσης της συμβολοσειράς στην μνήμη. Την χειρίζεται αυτοματα ο μεταγλωτιστής. Μολις δηλωθεί , ο δεικτης message δειχνει στην συμβολοσειρα και μπορει να χρησιμοποιηθεί με αυτο τον τροπο.
Η προηγούμενη δήλωση και αποδοση αρχικής τιμής ειναι ισοδύναμη με την ακόλουθη πρόταση -> char message[]="Hello"; , και οι 2 σημειογραφιες *message και message[] ειναι επισης ισοδύναμες. Και οι 2 σημαίνουν εναν δεικτη προς....
--------------------------------------------------


Ολα καλά αλλα δεν συμφωνω και πολυ με το οτι οι 2 δηλώσεις ειναι ισοδυναμες... οπως γραφει και ο King στην Σελ. 283 ..... Ηowever we must be careful to to make the mistake of thinking that the two versions of date are interchangeable .... δηλαδη δεν ειναι ισοδυναμες αυτες οι 2 με 2 λογια. Εκτος και αν μεταφραζω λαθος το interchangeable.

Δημοσ.

Μήπως είναι πολύ παλιό το βιβλίο; Έχω την εντύπωση πως σε K&R ήταν όντως ισοδύναμες (αλλά πάει και τόσος καιρός από τότε, ίσως να το θυμάμαι λάθος).

Δημοσ.
Μήπως είναι πολύ παλιό το βιβλίο; Έχω την εντύπωση πως σε K&R ήταν όντως ισοδύναμες (αλλά πάει και τόσος καιρός από τότε, ίσως να το θυμάμαι λάθος).

Nαι ειναι. 1997 αυτο απο το οποιο πηρα το αποσπασμα. ΑΛλα εχω και την δευτερη εκδοση των K&R που αναδιατυπωθηκε το 2005 . ΣΤην Σελ. 150 αυτου γραφει οσα και ο King περιπου.... αλλωστε και ο King εχει παρει καποια πραγματα σχεδον αυτουσια απο τα βιβλια των K&R. Φυσικα δεν γραφει πουθενα την μ****α οτι οι 2 δηλωσεις ειναι ισοδυναμες :P

Δημοσ.

Η 2η έκδοση του βιβλίου των K&R περιγράφει την ANSI C. Λέγοντας K&R C εννοούμε την προ ANSI εποχή, δηλαδή την 1η έκδοση του βιβλίου των K&R.

Δημοσ.
Η 2η έκδοση του βιβλίου των K&R περιγράφει την ANSI C. Λέγοντας K&R C εννοούμε την προ ANSI εποχή, δηλαδή την 1η έκδοση του βιβλίου των K&R.

Ναι καταλαβα οτι εννοουσες την 1η εκδοση εσυ. Για αυτο σου ειπα αλλωστε οτι το βιβλιο που εχω ειναι για την δευτερη :P

Δημοσ.
σωστός.

ωραια!

τωρα αν θελω να κανω το ιδιο με την χρηση pointers,πως θα γινει?

 

 

for(i=*table;i<=(*table*sizeof(tabletype));i++){}

 

ετσι θα ειναι το for? κατι δεν μου αρεσει ομως..

Δημοσ.
ωραια!

τωρα αν θελω να κανω το ιδιο με την χρηση pointers,πως θα γινει?

for(i=*table;i<=(*table*sizeof(tabletype));i++){}
 

ετσι θα ειναι το for? κατι δεν μου αρεσει ομως.. 

 

 

Πιστεύω δεν είναι καλή ιδέα να διατρέχεις με δείκτες πολυδιάστατους πίνακες, κυρίως διότι υπάρχουν περισσότεροι του ενός τρόποι, κανένας εκ των οποίων δεν εμπεδώνεται εύκολα αν δεν εισαι ήδη πολύ καλά εξοικειωμένος με τους δείκτες. Εξαρτάται επίσης και πως έχεις ορίσει τον 2Δ πίνακά σου (π.χ. είναι στατικά ορισμένος ή δυναμικά; Αν είναι δυναμικά, έχει ή κάθε του γραμμή ίδιο μήκος ή η κάθε γραμμή μπορεί να έχει διαφορετικό;

 

Γενικώς, είναι λίγο... βαβουρίτσα ;)

 

Τι πρόβλημα έχεις με τους απλούς indexers i και j?

Δημοσ.
ωραια!

τωρα αν θελω να κανω το ιδιο με την χρηση pointers,πως θα γινει?

for(i=*table;i<=(*table*sizeof(tabletype));i++){}
 

ετσι θα ειναι το for? κατι δεν μου αρεσει ομως..

 

 

Πιστεύω δεν είναι καλή ιδέα να διατρέχεις με δείκτες πολυδιάστατους πίνακες, κυρίως διότι υπάρχουν περισσότεροι του ενός τρόποι, κανένας εκ των οποίων δεν εμπεδώνεται εύκολα αν δεν εισαι ήδη πολύ καλά εξοικειωμένος με τους δείκτες. Εξαρτάται επίσης και πως έχεις ορίσει τον 2Δ πίνακά σου (π.χ. είναι στατικά ορισμένος ή δυναμικά; Αν είναι δυναμικά, έχει ή κάθε του γραμμή ίδιο μήκος ή η κάθε γραμμή μπορεί να έχει διαφορετικό;

 

Γενικώς, είναι λίγο... βαβουρίτσα ;)

 

Τι πρόβλημα έχεις με τους απλούς indexers i και j?

 

απλη ακαδημαικη περιεργεια! με indexes i και j μια χαρα το εχω καταλαβει,απλα θελω να ξετριψω λιγο και με τους pointers..

τωρα στατικα εχω ορισει τους πινακες,στο συγκεκριμενο test-Παραδειγμα,που φτιαχνω για εξασκηση..θεωρητικα αφου η C αραδιαζει τους πινακες τους δυσδιαστατους στην μνημη την μια σειρα μετα την αλλη,σκεφτηκα οτι θα ηταν πιο απλο,γιαυτο ρωτησα. αν ειναι μεγαλη βαβουρα,δωσε υλικο για να διαβασω για pointers μεχρι να φτασω σε ικανοποιητικο επιπεδο.

 

υγ:τους δεικτες ξερω να τους χρησιμοποιω γενικα,αλλα σε απλα πραγματα ακομα.

Δημοσ.

Αν ανατρέξεις μερικές σελίδες πίσω σε αυτό το νήμα (δεν θυμάμαι πόσες) θα βρεις 2-3 σελίδες μαζεμένες όπου αναλύουμε συγκεκριμένα 2D traversing με χρήση δεικτη... κάπου εκεί μέσα έχω δώσει και γρήγορο κώδικα ακριβώς για αυτό, και links με benchmarks.

 

Έλα, το βρήκα στα... κιτάπια μου τελικά... και είναι όπως το θέλεις (στατικά οιρισμένος δλδ ο arr2d με fixed length rows...

 

 

/* --------------------------------------------------
 *
 * --------------------------------------------------
 */
int arr2d_sum_elements( int arr2d[][NCOLS], int nrows )
{
	int sum = 0;

	if ( !arr2d || nrows < 1 )
		return INT_MIN;

	for (int i=0; i < nrows; i++)
		for (int j=0; j < NCOLS; j++)
			sum += arr2d[i][j];
	return sum;
}

/* --------------------------------------------------
 *
 * --------------------------------------------------
 */
int arr2d_sumElements( int arr2d[][NCOLS], int nrows )
{
	int sum = 0;

	// sanity check
	if ( !arr2d || nrows < 1 )
		return INT_MIN;

	// actual calc
#if 1
	int *walk = (int *)arr2d;			// address of arr2d's 1st int element
	int *stop = ((int *)arr2d + nrows * NCOLS);	// address of arr2d's last int element

	while ( walk < stop )
		sum += *walk++;
#else
	for (int *walk = (int *)arr2d; walk < ((int *)arr2d + nrows * NCOLS); walk++)
		sum += *walk;

#endif

	return sum;
}

/* --------------------------------------------------
 *
 * --------------------------------------------------
 */
int main( void )
{
	int arr2d[NROWS][NCOLS] = { {10, 20, 30}, {40, 50, 60} };

	arr2d_print( arr2d, NROWS );
	printf( "sum: %d\n", arr2d_sum_elements(arr2d, NROWS) );
	printf( "sum: %d\n", arr2d_sumElements(arr2d, NROWS) );

	system("pause");
	exit( EXIT_SUCCESS );

}

 

ψάξε αν είναι στο νήμα και για άλλους τρόπους, καθώς και για αναλύσεις (που σου είπα πριν).

Δημοσ.

Τίποτα ρε συ :)

 

ΥΓ. το έκανα λίγο edit τον κώδικα (σε περίπτωση που δεν σε πρόλαβα).

 

EDIT:

 

Βρήκα και τις σελίδες του νήματος τελικά: συν/πλην από αυτήν εδώ: http://www.insomnia.gr/topic/437533-%CE%B5%CF%81%CF%89%CF%84%CE%AE%CF%83%CE%B5%CE%B9%CF%82-%CE%B3%CE%B9%CE%B1-c/page-64

  • Like 1
Δημοσ.

>Δεν το πιάνω τι εννοει οταν λεει οτι ολα τα ονοματα που ξεκινουν με str και ενα lower-case letter ειναι δεσμευμενα για μελλοντικη χρηση σε συναρτησεις των strings πχ αμα ορισω μια strman(...) δεν μου κτυπαει ο compiler..... ειναι φυσιολογικο αυτο?

 

> Γιατι αν χρησιμοποιήσω μια στανταρ συνάρτηση της C για strings αλλα χωρις το header string.h δεν βαραει και παλι ο comp????

 

> Πως η strcmp δέχεται const char * αλλα δεν δινει warn ο comp ακομη και αν της περάσεις σκέτο char * ???

 

μηπως επειδη δεν ειναι σιγουρο αν ο εκαστοτε compiler υλοποιεί την strcmp οπως την παρουσιάζει ενα βιβλιο πχ?

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

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