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

Αντικατάσταση διακοπτόμενων συμβολοσειρών απο άλλες


Lomar

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

Χαίρεται, έχω το εξής πρόβλημα:

 

Θέλω σε ένα αρχείο κειμένου και .txt να αντικαταστήσω συγκεκριμένα σημεία του με κάποια άλλη συμβολοσειρά.

 

Συγκεκριμένα, θέλω το πρόγραμμά μου όπου βρίσκει την συμβολοσειρά "\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\" να αποκόβεται το "\Documents and Settings\Lomar\Τα έγγραφά μου\Η " και να αντικαθίσταται απο το: "D:\\".

 

Προσπάθησα κάνοντας το παρακάτω:

 

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

int main(){
   int i=0,flag=0;
   char name[40],name2[40],buff[20];
   
   FILE *ar, *dio;
   
   printf ("\n\n Dwse to onoma tou arxeiou: ");
   scanf ("%s",name);
   
   ar=fopen(name,"r");

   name2=name;

   strcat(name2,"-new.txt");
   
   dio=fopen(name2,"w");
                          
   while (!feof(ar)){
         fscanf (ar,"%s",buff);

         if ((strcmp(buff,"\"Documents")) == 0) || ((strcmp(buff,"and")) == 0) || ((strcmp(buff,"Settings\"Lomar\"Τα")) == 0) || ((strcmp(buff,"έγγραφα")) == 0) || ((strncmp(buff,"μου\"Η",3)) == 0)
            if (flag!=1){          
                                        flag=1;
                                        fprintf (dio,"%c","D:\\Η");
                                        }
            else
                fprintf (dio,%s,buff);
                                        
}

fclose (ar);
fclose (dio);

return 0;
}

                                       

 

Το πρόβλημα είναι οτι ο compiler μου εμφανίζει τα παρακάτω λάθη:

 

 

In function `main':

 

line 15: incompatible types in assignment

line 24: syntax error before '||' token (Εννοεί πριν την τη δεύτερη διάζευξη)

line 29: syntaz error before "else"

 

AT TOP LEVEL:

 

line 34: [Warning] parameter names (without types) in function declaration

line 34: [Warning] data definition has no type or storage class

line 35: [Warning] parameter names (without types) in function declaration

line 35: [Warning] data definition has no type or storage class

line 37: syntax error before "return"

 

 

Όπου χρειάστηκε έβαλα ελληνικούς χαρακτήρες. Ο compiler (interpreter ή όπως αλλιώς λέγεται) είναι ο Dev-C++ ver. 4.9.9.2.

 

 

Έψαξα αρκετή ώρα στο google, προσπάθησα κάτι καμμένα αεροπλανικά με stdin και stdout αλλά αυτός μου φάνηκε ο καλύτερος (δλδ πιο απλός και κατανοητός για εμένα) τρόπος να επιλύσω το πρόβλημα.

 

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

 

Ευχαριστώ εκ των προτέρων για τον χρόνο και τον κόπο σας, μέχρι στιγμής το forum με έχει βοηθήσει πάρα πολύ, να'στε καλά παιδιά και καλή συνέχεια.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 33
  • Δημ.
  • Τελ. απάντηση
name2=name;

Εξίσωση δεικτών διαφορετικών μεταβλητών. Αντικατέστησέ το με μία strcpy.

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

if ((strcmp(buff,"\"Documents")) == 0) || ((strcmp(buff,"and")) == 0) || ((strcmp(buff,"Settings\"Lomar\"Τα")) == 0) || ((strcmp(buff,"έγγραφα")) == 0) || ((strncmp(buff,"μου\"Η",3)) == 0)

Αν μετρήσεις τις παρενθέσεις που ανοίγουν και κλείνουν θα δεις ότι πριν το || ανοίγουν και κλείνουν 3+3 οπότε η if τελειώνει πριν το ||. Βασικά λοιπόν πρέπει να βάλεις επιπλέον δύο παρενθέσεις, μία να ανοίγει αμέσως μετά την λέξη if και μία που να κλείνει μετά το τέλος όλης της σύνταξης.

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

line 29: syntaz error before "else"

Είναι γενικά αποδεκτό να χρησιμοποιείς πάντα blocks στα if. Για παράδειγμα

>if (true) {
dump();
}

Βοηθάει σε πρώτη φάση για να ξεχωρίσεις τις δηλώσεις σου, να αποφύγεις απρόβλεπτα λάθη και να είναι πιο ευκολοδιάβαστο από έναν τρίτο :). Στο συγκεκριμένο βέβαια παράδειγμα φταίει το πιο πάνω λάθος αναγνώρισης της if αλλά λέμε τώρα ...

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

Προσπάθησε λίγο να τα συμμαζέψεις και πόσταρε... Δεν έχω Dev-C++ δυστυχώς. Σε VS2005 φαίνεται να μην έχει λάθη.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

int main(){
   int i=0,flag=0;
   char name[40],name2[40],buff[20];
   
   FILE *ar, *dio;
   
   printf ("\n\n Dwse to onoma tou arxeiou: ");
   scanf ("%s",name);
   
   ar=fopen(name,"r");

   strcpy(name2,name);

   strcat(name2,"-new.txt");
   
   dio=fopen(name2,"w");
                          
   while (!feof(ar)){
         fscanf (ar,"%s",buff);
         

         if (((strcmp(buff,"\"Documents")) == 0) || ((strcmp(buff,"and")) == 0) || ((strcmp(buff,"Settings\"Lomar\"Τα"")) == 0) || ((strcmp(buff,"έγγραφά")) == 0) || ((strncmp(buff,"μου\"Η",3)) == 0))
                                           if (flag!=1){          
                                              flag=1;
                                              fprintf (dio,"%s","D:\\Η");
                                              }
                                           else{
                                                /* keno */
                                                }
            
            
         else{
                fprintf (dio,"%s",buff);
                fprintf (dio,"%c"," ");
                }
                                        
}

fclose (ar);
fclose (dio);

return 0;
}

 

Πολύ καλύτερα.

 

Μοναδικό πρόβλημα όταν τρέχει είναι οτι δεν γράφονται τα κενά, προσπάθησα να το διορθώσω με το:

 

>

fprintf (dio,"%c"," ");

 

αλλά τπτ...

 

καμιά ιδέα κανείς για τα κενά.

 

Επίσης δεν μου αντικαθιστά τις λέξεις κλειδιά μέσα στην if... Δεν καταλαβαίνω γιατί.

 

Τέλος @bookysmell2004 sorry αλλά αυτό με την if που μου είπες δεν το πολυκατάλαβα... μήπως εννοείς να ενσωματώσω την κάθε κλήση της strcmp σε μια int μεταβλητή, και στο τέλος να τις χρησιμοποιήσω στην if; πχ: a=strcmp(buff,"kati"); b=strcmp(buff,"kati2"); κτλ και στο τέλος if(!a || !b || !c){ktl... ???

 

Κάτι σαν το παραπάνω εννοείς;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

if (((strcmp(buff,"\"Documents")) == 0) || ((strcmp(buff,"and")) == 0) || ((strcmp(buff,"Settings\"Lomar\"Τα"")) == 0) || ((strcmp(buff,"έγγραφά")) == 0) || ((strncmp(buff,"μου\"Η",3)) == 0))

if (flag!=1){

flag=1;

fprintf (dio,"%s","D:\\Η");

}

else{

/* keno */

}

 

Θα σου πρότεινα να γράφεις κάθε if μέσα σε blocks όπως παρακάτω:

>if (((strcmp(buff,"\"Documents")) == 0) || ((strcmp(buff,"and")) == 0) || ((strcmp(buff,"Settings\"Lomar\"Τα"")) == 0) || ((strcmp(buff,"έγγραφά")) == 0) || ((strncmp(buff,"μου\"Η",3)) == 0)) [b][color="Red"]{[/color][/b]
                                           if (flag!=1){          
                                              flag=1;
                                              fprintf (dio,"%s","D:\\Η");
                                              }
                                           else{
                                                /* keno */
                                                }
[b][color="Red"]}[/color][/b]

ώστε να δηλώσεις ρητά την αρχή και το τέλος μιας if. Είναι πολύ χρήσιμο όταν δουλεύεις με εμφωλευμένα if και όχι μόνο. Οι άδειες else είναι περιττές...

Ίσως να έχει να κάνει με το πρόβλημα με τα κενά ...

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τέλος @bookysmell2004 sorry αλλά αυτό με την if που μου είπες δεν το πολυκατάλαβα... μήπως εννοείς να ενσωματώσω την κάθε κλήση της strcmp σε μια int μεταβλητή, και στο τέλος να τις χρησιμοποιήσω στην if; πχ: a=strcmp(buff,"kati"); b=strcmp(buff,"kati2"); κτλ και στο τέλος if(!a || !b || !c){ktl... ???

 

Κάτι σαν το παραπάνω εννοείς;

 

Η πρώτη του παρατήρηση για την if ήταν να προσέχεις το πόσες παρενθέσεις ανοίγεις και πόσες κλείνεις, το δεύτερο που είπε είναι, ότι είναι καλό να χρησιμοποιείς blocks στις διάφορες if, while,... για να μπορείς να καταλαβαίνεις πιο εύκολα σε πιο block ανήκει η κάθε γραμμή. Επίσης κάτι άλλο που βοηθάει είναι το identation (αυτό που πατάς tab, δεν ξέρω πως λέγεται στα ελληνικά).

 

π.χ.

 

>int sfaliares = 10;
while (sfaliares >= 0)
   {
   if (trexa == gyreve)
       {
           printf("Pare na 'xeis %s", sfaliares);
       }
   if (sfaliares < 5)
       {
           printf("Ela liges einai akoma");
       }
       else
       {
           printf("Erxetai akoma mia");
       }
   }
printf("Teleiwsan oi sfaliares");

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι όντως είναι λιγάκι κουραστικό...

Πολύ καλό όμως το παραδειγματάκι σου nikosdimos!

 

:-D Το σκέφτηκα έτσι στα γρήγορα, πιστεύω τον εκπαιδευτικό σκοπό του τον εξυπηρετεί άσχετα με το λίίίίίίίγο άκυρο περιεχόμενο του. :-D:-D

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>
int sfaliares = 10;
while (sfaliares >= 0)
   {
   if (trexa == gyreve)
       {
           printf("Pare na 'xeis %s", sfaliares);
       }
   if (sfaliares < 5)
       {
           printf("Ela liges einai akoma");
       }
       else
       {
           printf("Erxetai akoma mia");
       }
   }
printf("Teleiwsan oi sfaliares");

 

Δεν κατάλαβα το φιλοσοφικό-εκπαιδευτικό χαρακτήρα του κώδικά σου. άσε που μου κάνει για ατέρμον βρόγχος...

 

Τέλος πάντων, bookysmell2004 όντως διαπίστωσα οτι έπρεπε να προσθέσω και εκείνο το σετ απο αγκύλες... αλλά τπτ...

 

Διαπίστωσα οτι τα κενά τα αντικαθιστά με 'ο'.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Lomar, το παράδειγμα του nikosdimos ήταν ένα παράδειγμα (όπως και ο ίδιος είπε) για να μας δείξει τη στοίχηση. Δεν αποτελεί τμήμα κώδικα αλλά ένα στοιχισμένο πρόγραμμα σαν παράδειγμα για τα δικά σου.

 

Όσων αφορά στο δικό σου πρόγραμμα το έφτιαξα λίγο καλύτερα ...

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

int main() {
int i=0,flag=0;
char name[40],name2[40],buff[20];

FILE *ar, *dio;
printf ("\n\n Dwse to onoma tou arxeiou: ");
scanf ("%s",name);
ar=fopen(name,"r");
strcpy(name2,name);
strcat(name2,"-new.txt");
dio=fopen(name2,"w");
while (!feof(ar))
{
	fscanf (ar,"%s",buff);
	if (((strcmp(buff,"\"Documents")) == 0) || ((strcmp(buff,"and")) == 0) || ((strcmp(buff,"Settings\"Lomar\"Τα\"")) == 0) || ((strcmp(buff,"έγγραφά")) == 0) || ((strncmp(buff,"μου\"Η",3)) == 0))
	{
		if (flag!=1)
		{
			flag=1;
			fprintf (dio,"%s","D:\\Η");
		}
	}
	else
	{
		fprintf (dio,"%s",buff);
		fprintf (dio,"%c",' ');
	}
}
fclose (ar);
fclose (dio);
return 0;
}

Για τα 'ο' δεν παρατήρησα κάτι... Κάνει ό,τι θα έπρεπε να κάνει.

Δώσε μου το αρχείο σου με τα paths αν θες να το δοκιμάσω σήμερα το βράδυ μόλις αδειάσω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μπορείς να μου πεις ποιον compiler χρησιμοποιείς; Το βρίσκω πιο βολικό απο το να ανεβάσω το αρχείο.

 

Μου είχες πει οτι δεν σου έβγαζε error ενώ εμένα ο δικός μου μου εμφάνιζε.

 

Σε ευχαριστώ πάντως για τον κόπο σου.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

EXTM3U

#EXTINF:101,The Dust Brothers by Apollwnas - Fight With Lou

\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\Fight_Club_OST__Special_Edition\Fight Club OST [special Edition]_partI\26 - Fight With Lou.mp3

#EXTINF:133,The Dust Brothers by Apollwnas - Setting Up A Fight

\Documents and Settings\Lomar\Τα έγγραφά μου\Η μουσική μου\Fight_Club_OST__Special_Edition\Fight Club OST [special Edition]_partI\28 - Setting Up A Fight.mp3

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν κατάλαβα το φιλοσοφικό-εκπαιδευτικό χαρακτήρα του κώδικά σου. άσε που μου κάνει για ατέρμον βρόγχος...

 

Σωστά σου κάνει για ατέρμον βρόχος μιας και δεν μειώνω ποτέ το sfaliares παραθέτω και το σωστό:

>
int sfaliares = 10;
while (sfaliares >= 0)
   {
   if (trexa == gyreve)
       {
           printf("Pare na 'xeis %s", sfaliares);
       }
   if (sfaliares < 5)
       {
           printf("Ela liges einai akoma");
       }
       else
       {
           printf("Erxetai akoma mia");
       }
   sfaliares = sfaliares - 1;
   }
printf("Teleiwsan oi sfaliares");

 

Αλλά όπως είχα πει αυτό ήταν ένα παράδειγμα μορφοποίησης έτσι ώστε να είναι πιο εύκολο στο μάτι το debugging. Σε καμία περίπτωση δεν ήταν ένα παράδειγμα κώδικα που έκανε κάτι χρήσιμο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@nikosdimos sorry παρανόησα :)

 

Όντως πρέπει να έχω πιο συγκεντρωτική δομή στο κώδικα μου.

 

@bookysmell2004

 

Το πρόγραμμα - αν κατάλαβα καλά - οταν το τρέχεις σου εμφανίζει κανονικά κενά, και το πρόβλημα είναι οτι δεν απαλείφονται οι προτάσεις που θέλω;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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


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