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

Απορια στην c!


anemelos4

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

Δημοσ.

Καλησπέρα,

 

Εχώ να φτιάξω ενα πρόγραμμα που κανει το εξης:

 

Γράψτε µια συνάρτηση find_last_char η οποία παίρνει ως παραµέτρους µια συµβολοσειρά

και ένα χαρακτήρα, βρίσκει την τελευταία εµφάνιση του χαρακτήρα στη συµβολοσειρά και

επιστρέφει ένα δείκτη σε αυτόν. Αν ο χαρακτήρας δεν εµφανίζεται στη συµβολοσειρά, επιστρέφει

NULL. Απαγορεύεται να χρησιµοποιήσετε συναρτήσεις συµβολοσειρών από τη βιβλιοθήκη της C

εκτός από την strlen. Απαγορεύεται η χρήση του τελεστή [ ].

 

Γράψτε µια συνάρτηση main η οποία παρουσιάζει το παρακάτω µενού στο χρήστη:

1. find last char

2. reverse

Αν ο χρήστης επιλέξει 1, του ζητά: "Enter string: " και διαβάζει µια συµβολοσειρά µεγέθους µέχρι

20 και ακολούθως "Enter character: " και διαβάζει ένα χαρακτήρα. Μετά, καλεί τη συνάρτηση

find_last_char και εκτυπώνει στην οθόνη την τιµή που επιστρέφει η συνάρτηση µε %s.

 

Το κανω compile κανονικα (o compiler δεν μου βγαζει errors ή warnings) αλλα οταν το τρεχω μου βγαζει Segmentation fault:mad: δοκιμαζω με debugger να βρω το λαθος αλλα τιποτα :confused: μπορει κανεις να μου δωσει ενα χερι βοηθειας?

 

Ευχαριστώ!

 

P.S Μπορει το λαθος να ειναι προφανες απλα τωρα μπηκαν στην ζωη μου οι pointers (ειναι hardcore οι ατιμοι:lol:) και προσπαθω να καταλαβω τι παιζει!

 

>

/*...*/

#include <stdio.h>
char b;
char *find_last_char(char *s,char x);
 
int main (int argc,char *argv[]){

    int choice;
    char *str,ch,*a;
    

     printf("1. find last char \n2. reverse \n");
     scanf ("%d",&choice);


     if (choice == 1){

	      printf ("Enter a string: ");
	      scanf ("%20s",str);
   
	      printf ("Enter a char: ");
	      scanf (" %c",&ch);

	      a=find_last_char(str,ch);
     
	      printf ("%s",a);
     
	      return 0;

      }
    
     
	      return 0;
  

}

char *find_last_char(char *s,char x){

int flag=0;

while (*s){

      if(*s==x){
	      
	      b=x;
	      flag=1 ;
      }
	
      s++;
}

if (flag==0){

      return (NULL);
}

else {

      return &b;
}
}  

Δημοσ.

Το πρόβλημα είναι ότι δεν έχεις δεσμεύσει χώρο για το str οπότε

σου κρεμάει... Χρησιμοποίησε τη malloc και θα είσαι οκ!

Δημοσ.

Το πρόβλημα είναι ότι δεν έχεις δεσμεύσει χώρο για το str οπότε

σου κρεμάει... Χρησιμοποίησε τη malloc και θα είσαι οκ!

 

σωστό δες τις αλλαγές στον κώδικα σου

 

 

>
#include <stdio.h>
[color="Red"]#include <malloc.h>[/color]

char b;
char *find_last_char(char *s,char x);
 
int main (int argc,char *argv[]){

    int choice;
    char *str,ch,*a;
    [color="Red"]str=(char *) malloc(20*sizeof(char));[/color]

     printf("1. find last char \n2. reverse \n");
     scanf ("%d",&choice);


     if (choice == 1){

	      printf ("Enter a string: ");
	      scanf ("%s",str);
		      printf ("Enter a char: ");
	      scanf (" %c",&ch);
	      a=find_last_char(str,ch);
	      printf ("%s",a);
      }
	      return 0;
}

char *find_last_char(char *s,char x){
int flag=0;
while (*s){
      if(*s==x){
	      b=x;
	      flag=1 ;
      }
      s++;
}

if (flag==0){

      return (NULL);
}

else {

      return &b;
}
}

Δημοσ.

Μία πιο optimized λύση:

>
#include <stdio.h>
[color="Red"]#include <stdlib.h>[/color]

char *find_last_char(char *s,char x);
 
int main (int argc,char *argv[])
{
   int choice;
   char *str, ch, *a;

   str=(char *) malloc(20*sizeof(char));

   printf("1. find last char \n2. reverse \n");
   scanf ("%d",&choice);

   if (choice == 1)
   {
       printf ("Enter a string: ");
       scanf ("%s",str);
       printf ("Enter a char: ");
       scanf (" %c",&ch);
       a = find_last_char(str,ch);
[color="Red"]
       if (a != NULL)
           printf ("%s\n", a);
       else
           printf ("not found\n");
[/color]
   }
   return 0;
}

char * find_last_char(char *s,char x)
{[color="Red"]
   char *p = NULL;

   while (*s)
   {
       if(*s==x)
           p=s;
       s++;
   }
   return p;[/color]
}

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

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

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