linuxs Δημοσ. 20 Ιουνίου 2010 Δημοσ. 20 Ιουνίου 2010 /* strlen */ Η συνάρτηση αυτή επιστρέφει με πλήθος των χαρακτήρων απο την συμβολοσειρά που δώσατε. > [color="SeaGreen"] #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void){ char buf1[81]="-"; char buf2[81]="-"; int x; printf("buf[1]: %s\n", buf1); printf("buf[2]: %s\n", buf2); printf("\nConfiguring 'strlen'.\n"); printf("Please type your name:"); scanf("%s", buf1); x = strlen(buf1); printf("Your name is %d long.\n", x); return 0; } [/color] /* strcpy */ Η συνάρτηση αυτή αντιγράφει μια συμβολοσειρά σε ένα πινακάκι > [color="SeaGreen"] #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void){ char buf1[81]="This is a sentence"; char buf2[81]="-"; printf("\nConfiguring 'strcpy'.\n"); printf("Before 'strcpy':\tbuf1: %s\tbuf2: %s\n", buf1, buf2); strcpy(buf2,buf1); printf("After 'strcpy':\t\tbuf1: %s\tbuf2: %s\n", buf1, buf2); return 0; } [/color] /* strcat */ Η συνάρτηση αυτή "κολλάει" ένα αντίγραφο μιας συμβολοσειράς σε μια άλλη. > [color="SeaGreen"] #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void){ char buf1[81]="This is a sentence"; char buf2[81]="-"; printf("\nConfiguring 'strcat'.\n"); strcpy(buf1,"This is "); strcpy(buf2,"a strcat example."); printf("Before 'strcat':\tbuf1: %s\t\t\tbuf2: %s\n", buf1, buf2); strcat(buf1,buf2); printf("After the 'strcat':\tbuf1: %s\tbuf2: %s\n", buf1, buf2); return 0; }[/color] /* strcmp */ Η συνάρτηση αυτή "συγκρίνει" μια συμβολοσειρά με μια άλλη και επιστρέφει ποιά είναι μεγαλύτερη. έστω: strcmp(str1, str2). oι δυνατές επιστροφές είναι οι εξής: > <0 --> όταν str1<str2 0 --> όταν str1=str2 >0 --> όταν str1>str2 > [color="SeaGreen"] #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void){ char buf1[81]="This is a sentence"; char buf2[81]="-"; printf("\nConfiguring 'strcat'.\n"); strcpy(buf1,"This is "); strcpy(buf2,"a strcat example."); printf("Before 'strcat':\tbuf1: %s\t\t\tbuf2: %s\n", buf1, buf2); strcat(buf1,buf2); printf("After the 'strcat':\tbuf1: %s\tbuf2: %s\n", buf1, buf2); return 0; }[/color] υπομονή για όσους τις χρειάζεστε μέχρι αύριο...θα προσθεθούν και οι υπόλοιπες... να σημειώσω πως αν κάποιος φίλος μας μπορεί να ετοιμάσει κάτι σαν τα παραπάνω ας το στείλει με e-mail στο [email protected] και θα το προσθέσω...θα μπορούσατε να κάνετε και post αλλα νομίζω πως θα γίνει ένας χαμός... ελπίζω να λυθούν απορίες... ευχαριστώ...
V.I.Smirnov Δημοσ. 20 Ιουνίου 2010 Δημοσ. 20 Ιουνίου 2010 Οι ρουτίνες που δίνεις με ελάχιστο ψάξιμο είναι πολύ εύκολο να βρεθούν σε εγχειρίδια αναφοράς, στο help κ.α. Αν έχεις, βάλε κάτι πιο σύνθετο. Θα μπορούσες, εφόσον ξέρεις, να γράψεις λίγα λόγια για την χρήση τέτοιων συναρτήσεων με χαρακτήρες unicode ή ποιές είναι οι αντίστοιχες για strings τύπου string ή ποιές είναι οι διαφορές των strings τύπου char* από τα τύπoυ string κλπ. Αυτά είναι που δεν ξέρουμε καλά. Να μια συνεισφορά και από εμένα : Αφαίρεση όλων των ίδιων χαρακτήρων από τη δεξιά πλευρά ενός string. Δηλ. trimming σε string. Δουλεύει για όλα τα ήδη strings κι όχι μόνον για char* . > #include <string> #include <iostream> using namespace std; // A generic approach for trimming single characters from a string template<typename T> void rtrim(basic_string<T>& s, T c) { if (s.empty( )) return; typename basic_string<T>::iterator p; for (p = s.end( ); p != s.begin( ) && *--p == c;); if (*p != c) p++; s.erase(p, s.end( )); } int main( ) { string s = "example 1 ####; rtrim(s, '#'); cout << s << '\n'; wstring ws = L"exampole 2 ####"; rtrim(ws, L'#'); wcout << ws << L'\n'; return 0; } Η παραπάνω ρουτίνα δεν λειτουργεί για λευκά διαστήματα (white spaces) διότι ένα λευκό διάστημα μπορεί να είναι από πολλά είδη χαρακτήρων. Για λευκά διαστήματα είναι η ακόλουθη : > #include <string> #include <iostream> #include <cctype> #include <cwctype> using namespace std; template<typename T, typename F> void rtrimws(basic_string<T>& s, F f) { if (s.empty( )) return; typename basic_string<T>::iterator p; for (p = s.end( ); p != s.begin( ) && f(*--p); if (!f(*p)) p++; s.erase(p, s.end( )); } void rtrimws(string& s) { rtrimws(s, isspace); } void rtrimws(wstring& ws) { rtrimws(ws, iswspace); } int main( ) { string s = "example 1 "; rtrimws(s); cout << s << "|\n"; wstring ws = L"example 2 "; rtrimws(ws); wcout << ws << L"|\n"; return 0; } Έχω κι άλλες τέτοιες, θα τις βάλω αλλη φορά...
linuxs Δημοσ. 20 Ιουνίου 2010 Μέλος Δημοσ. 20 Ιουνίου 2010 Smirnov μπορείς να κάνεις κάτι με την strchr()? ---------- Προσθήκη στις 01:06 ---------- Προηγούμενο μήνυμα στις 01:03 ---------- Να μια συνεισφορά και από εμένα. Αφαίρεση όλων των ίδιων χαρακτήρων από τη δεξιά πλευρά ενός string. Δηλ. trimming σε string. Δουλεύει για όλα τα ήδη strings κι όχι μόνον για char* . > #include <string> #include <iostream> using namespace std; // A generic approach for trimming single characters from a string template<typename T> void rtrim(basic_string<T>& s, T c) { if (s.empty( )) return; typename basic_string<T>::iterator p; for (p = s.end( ); p != s.begin( ) && *--p == c;); if (*p != c) p++; s.erase(p, s.end( )); } int main( ) { string s = "example 1 ####; rtrim(s, '#'); cout << s << '\n'; wstring ws = L"exampole 2 ####"; rtrim(ws, L'#'); wcout << ws << L'\n'; } Δεν λειτουργεί για λευκά διαστήματα (white spaces). Για λευκά διαστήματα είναι η παρακάτω : > #include <string> #include <iostream> #include <cctype> #include <cwctype> using namespace std; template<typename T, typename F> void rtrimws(basic_string<T>& s, F f) { if (s.empty( )) return; typename basic_string<T>::iterator p; for (p = s.end( ); p != s.begin( ) && f(*--p); if (!f(*p)) p++; s.erase(p, s.end( )); } void rtrimws(string& s) { rtrimws(s, isspace); } void rtrimws(wstring& ws) { rtrimws(ws, iswspace); } int main( ) { string s = "example 1 "; rtrimws(s); cout << s << "|\n"; wstring ws = L"example 2 "; rtrimws(ws); wcout << ws << L"|\n"; } Έχω κι άλλες τέτοιες αλλά επιφυλάσομαι για το μέλλον. Να κάνω μια ερώτηση. Αυτά τα δυο τι είναι? C programs? είναι σωστα? εντελώς φιλικά το λέω...απλά γιατί έχω ένα πρόβλημα...
macabre_sunsets Δημοσ. 20 Ιουνίου 2010 Δημοσ. 20 Ιουνίου 2010 Υπάρχει και η stricmp στην οποία δεν παίζουν ρόλο τα κεφαλαία και μικρά γράμματα.
imitheos Δημοσ. 20 Ιουνίου 2010 Δημοσ. 20 Ιουνίου 2010 Σχετικά με την χρήση της strlen. Η C δεν υποστηρίζει strings και τα υλοποιεί απλά ως σειρές από χαρακτήρες που τελειώνουν με τον χαρακτήρα μηδέν. Αυτό δημιουργεί το πρόβλημα ότι δεν μπορούμε να ξέρουμε το μήκος ενός string και για να το βρούμε πρέπει να διατρέξουμε όλο το string. Αυτό καθιστά την χρήση της συνάρτησης strlen βαριά για αυτό και πρέπει να αποφεύγεται όπου είναι αυτό δυνατόν. > for (i=0; i<strlen(s); i++) printf("%c ",s[i]); Ο παραπάνω κώδικας είναι ένα πολύ απλό παράδειγμα που τυπώνει έναν-έναν τους χαρακτήρες ενός string. Για κάθε χαρακτήρα εκτελείται μία φορά η strlen η οποία θα διατρέξει όλο το string. Αν το string δεν αλλάζει τότε μπορούμε να εκτελέσουμε μία φορά στην αρχή την strlen όπως φαίνεται παρακάτω. > len=strlen(s); for (i=0; i < len; i++) printf("%c ",s[i]); Γενικά όμως, υπάρχουν περιπτώσεις (όπως και εδώ) που θέλουμε να εκτελέσουμε μια ανακύκλωση τόσες φορές όσοι οι χαρακτήρες του string μας, δεν μας νοιάζει όμως πόσοι είναι αυτοί, έτσι δεν χρειαζόμαστε την strlen. Μπορούμε να χρησιμοποιήσουμε προς όφελος μας το γεγονός ότι τα string τελειώνουν με τον χαρακτήρα μηδέν οπότε ο παραπάνω κώδικας μπορεί να ξαναγραφεί ως εξής: > for (i=0; s[i]; i++) printf("%c ",s[i]); Τώρα το for θα λήξει όταν η συνθήκη ελέγχου s δεν ισχύει πια δηλαδή όταν είναι μηδέν κατά συνέπεια όταν τελειώσει το string μας. ** Η strlen υλοποιείται συχνά χρησιμοποιώντας word operations και δεν διατρέχει όλο το string οπότε η χρήση της δεν είναι τόσο βαριά όσο παλιά αλλά και πάλι καλό είναι να αποφεύγεται όπου δεν χρειάζεται. Τυπική υλοποίηση (OpenBSD) Πιο γρήγορη υλοποίηση με words (FreeBSD)
V.I.Smirnov Δημοσ. 20 Ιουνίου 2010 Δημοσ. 20 Ιουνίου 2010 Smirnov μπορείς να κάνεις κάτι με την strchr()? ---------- Προσθήκη στις 01:06 ---------- Προηγούμενο μήνυμα στις 01:03 ---------- Να κάνω μια ερώτηση. Αυτά τα δυο τι είναι? C programs? είναι σωστα? εντελώς φιλικά το λέω...απλά γιατί έχω ένα πρόβλημα... 1) Είναι C++, εγώ δεν χρησιμοποιώ σκέτη C. Εξάλλου είναι φανερό αφού η C δεν έχει πχ. templates. 2) Αυτά που δίνω είναι ιδιοκατασκευές που κάποτε βρήκα ή έφτιαξα όταν μου χρειάστηκαν. Τα έχω δοκιμάσει πρώτα στο visual studio 2008 και τρέχουν κανονικά (0 errors, 0 warnings). Παραταύτα μπορεί να έχουν αβλεψίες διότι εγώ δεν έχω συστηματική εκπαίδευση στη C++. Αν υπονοείς ότι ξέχασα το return 0; στη main έχεις δίκιο. Το διόρθωσα. 3) Όσο για την strchr, κι εκεί έχω κάνει διάφορα στο παρελθόν. Πες μου τι θέλεις και αν έχω κάτι ευχαρίστως θα σου το στείλω.
Directx Δημοσ. 20 Ιουνίου 2010 Δημοσ. 20 Ιουνίου 2010 Smirnov μπορείς να κάνεις κάτι με την strchr()?[..] Εγώ πάντως με την strchr έτσι στα γρήγορα και δίχως πολλά - πολλά μπορώ να σκεφτώ μια function σε C, που θα αντικαθιστά όλα τα char ενός string με κάποιο άλλο char, χρησιμοποιώντας την strchr για την εύρεση της θέσης έκαστου προς αντικατάσταση char. > // Lame strchr example #include <stdio.h> #include <string.h> char* _ReplaceChr(char *ptrStr, const char From, const char To); int main(void) { char *ptrIn = "StRChR Replace!"; printf("Before _ReplaceChr = \"%s\"\n", ptrIn); _ReplaceChr(ptrIn, 'R', 'r'); printf("After _ReplaceChr = \"%s\"\n\nPress Enter to exit..", ptrIn); getchar(); return 0; } char* _ReplaceChr(char *ptrStr, const char From, const char To) { char *ptrChr; while(From != To && (ptrChr = strchr(ptrStr, From)) != NULL) ptrStr[ptrChr - ptrStr] = To; return ptrStr; } @V.I.Smirnov: Το "using namespace std" είναι μια καλή λύση - αλλά αν κάποιος δεν επιθυμεί να το χρησιμοποιήσει στο source του, αξίζει να προσθέσεις ένα std:: στα functions σου ώστε να λειτουργούν άμεσα και σε αυτή την περίπτωση (δήλωση "std namespace" ή μη).
V.I.Smirnov Δημοσ. 20 Ιουνίου 2010 Δημοσ. 20 Ιουνίου 2010 @V.I.Smirnov: Το "using namespace std" είναι μια καλή λύση - αλλά αν κάποιος δεν επιθυμεί να το χρησιμοποιήσει στο source του, αξίζει να προσθέσεις ένα std:: στα functions σου ώστε να λειτουργούν άμεσα και σε αυτή την περίπτωση (δήλωση "std namespace" ή μη). Ευχαριστώ για την επισήμανση. Γενικά δεν το χρησιμοποιώ έτσι (αν και είναι κακή πρακτική) διότι βαραίνει ο κώδικας. Όποιος θέλει μπορεί να κάνει τις τροποποιήσεις που τον βολεύουν... Να και ένα άλλο δωράκι : μετατροπή ενός αντικειμένου string σε char*. >#include <iostream> #include <string> #include <cstring> using namespace std; int main() { string str("This is a test."); char cstr[80]; cout << "Here is the original string:\n"; cout << str << "\n\n"; // obtain a pointer to the string. const char *p = str.c_str(); cout << "Here is the null-terminated version of the string:\n"; cout << p << "\n\n"; /* copy the string into a statically allocated array. first, confirm that the array is long enough to hold the string. */ if(sizeof(cstr) < str.size() + 1) { cout << "Array is too small to hold the string.\n"; return 0; } strcpy(cstr, p); cout << "Here is the string copied into cstr:\n" << cstr << "\n\n"; // next, copy the string into a dynamically allocated array. try { // dynamically allocate the array. char *p2 = new char[str.size()+1]; // copy the string into the array. strcpy(p2, str.c_str()); cout << "String after being copied into dynamically-allocated array:\n"; cout << p2 << endl; delete [] p2; } catch(bad_alloc ba) { cout << "Allocation Failure\n"; return 1; } return 0; }
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.