nrkmaiden Δημοσ. 8 Δεκεμβρίου 2010 Δημοσ. 8 Δεκεμβρίου 2010 Εχω την εξης συναρτηση η οποια παιρνει ενα array αφαιρει τα κενα και επειτα τον αντιστρεφει. > char check(char ep[],const int arraySize,char my_array[],char reverse_array[]){ int i,j=0; for( i=0 ; i<arraySize ; i++){ if(ep[i]!=' '){ if(ep[i]=='\0') break; my_array[j] = ep[i]; j++; }//telos if }//telos for cout<<j<<"\n"<<endl; int counter,numb=j; for(counter=0;counter<j;counter++){ my_array[numb-counter]=reverse_array[counter]; } return my_array[arraySize],reverse_array[counter]; } ομως το προγραμμα δε λειτουργει σωστα. μπορει καποιος να με βοηθησει να βρω τ λαθος; ευχαριστω προκαταβολικα
V.I.Smirnov Δημοσ. 8 Δεκεμβρίου 2010 Δημοσ. 8 Δεκεμβρίου 2010 Αν δεν πρόκειται για άσκηση ώστε να σε περιορίζει, κάνε το σε C++ ως εξής (περίπου) : >// Reverse a null terminated string in place. #include <iostream> #include <cstring> using namespace std; void revstr(char *str); int main() { char str[] = "abcdefghijklmnopqrstuvwxyz"; cout << "Original string: " << str << endl; revstr(str); cout << "the string after reversing : " << str << endl; return 0; } // Reverse a string in place. void revstr(char *str) { int i, j; char t; for(i = 0, j = strlen(str)-1; i < j; ++i, --j) { t = str[i]; str[i] = str[j]; str[j] = t; } } Το παραπάνω δεν αφαιρεί τα κενά - ψάξτο μόνος σου αυτό. Υπάρχουν κι' άλλοι τρόποι που είναι έτοιμοι και ακόμα πιο γρήγοροι (μια εντολή) και επιστρέφουν ανεστραμμένο ένα νέο string αφήνοντας το αρχικό άθικτο (βλ. reverse της STL κλπ). Παιδεύεστε άσκοπα με την C του κερατά.... Το παρακάτω που έχεις γράψει : return my_array[arraySize],reverse_array[counter]; είναι πολύ χοντρό λάθος. Mια συνάρτηση επιστρέφει μόνον μια μεταβλητή. Και δεν μπορεί να επιστρέψει πίνακα, παρά μόνον δείκτη σε πίνακα (στο πρώτο στοιχείο του). -
virxen75 Δημοσ. 9 Δεκεμβρίου 2010 Δημοσ. 9 Δεκεμβρίου 2010 μία λύση θα μπορούσε να είναι αυτό έτσι θα έχεις και το string χωρίς κενά αλλά και reversed > #include <stdio.h> #include <stdlib.h> #include <string.h> void check(char [],char[],char[]); int main(){ char ep[10]="1 2 3 456"; char ep_nospace[10]; char ep_reversed[10]; check(ep,ep_nospace,ep_reversed); printf("\n original=#%s# , no space=#%s# , reversed=#%s#",ep,ep_nospace,ep_reversed); getchar(); return 0; } void check(char ep[],char my_array[],char reverse_array[]){ int i=0,j=0; while(ep[i]!='\0'){ if(ep[i]!=' ') my_array[j++] = ep[i]; i++; }//telos while my_array[j]='\0'; int counter; for(counter=0;counter<j;counter++){ reverse_array[counter]=my_array[j-counter-1]; } reverse_array[j]='\0'; }
nrkmaiden Δημοσ. 9 Δεκεμβρίου 2010 Μέλος Δημοσ. 9 Δεκεμβρίου 2010 Να η συναρτηση με της διορθωσεις και τις συμβουλες σας.Το προγραμμα τρεχει κανονικα. > int i,j=0; char my_array[arraySize]; for( i=0 ; i<arraySize ; i++){ if(ep[i]!=' '){ if(ep[i]=='\0') break; my_array[j] = ep[i]; j++; }//telos if }//telos for cout<<j<<"\n"<<endl; int counter; my_array[j]='\0'; for(counter=0;counter<j;){ reverse_array[counter++] = my_array[j-counter-1]; } reverse_array[counter]='\0'; cout<<my_array<<"\n"<<endl; cout<<reverse_array<<"\n"<<endl; return 0; }
NewProject Δημοσ. 9 Δεκεμβρίου 2010 Δημοσ. 9 Δεκεμβρίου 2010 για να μην ανοιγω καινουργιο topic ... θελω να δηλωσω ενα array το οποιο να περιεχει char[32] και στη συνεχεια να κανω δυναμικη δεσμευση μνημης δηλαδη στην αρχη δεν γνωριζω ποσα "string" θα περιεχει το 2d array αλλα ξερω οτι το καθενα απο τα στοιχεια ειναι char[32] . Πχ. κατι τετοιο : > ... char** array_of_strings; unsigned len = 99; ... array_of_strings = new char[len][32]; ... τελικα εκανα : > char** array_of_strings; unsigned len = 99; ... array_of_strings=new char*[len]; for(unsigned int alloc = 0; alloc<len ; alloc++ ) array_of_strings[alloc] = new char[32]; Αν και 1. Δεν εχω δοκιμασει ακομα αν δουλευει 2. Δεν μου φενεται και ο πιο σωστος τροπος
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.