string "distinct" machen



  • hallo leute,
    ich habe eine aufgabe, die mir sagt ich solle eine eingabe übernehmen und aus dieser eingabe alle buchstaben, die doppelt vorkommen ignorieren.
    z.b. wenn eingabe = "hallo" soll "halo" rauskommen usw.

    ich habe mir einen code zusammengeschrieben, der mir für jeden buchstaben, der bereits einmal vorgekommen ist, ein x einfügt, hier "halxo".

    ich habe dies mit dieser schleife gemacht.

    for (i = 0; i < strlen(input); i++)
    {
    for (j = 0; j < strlen(input); j++)
    {
    if (input[j] == input[i] && j != i)
    {

    input[j] = 'x';

    }
    }
    }

    bitte um hilfe, wäre sehr dankbar!

    lg c93



  • #include <stdio.h>
    #include <locale.h>
    
    int main ( void )
    {
    	char buf [ ] = "GGGGGGUUUUUUUDDDÄÄÄÄÄNNN MMMMMOOOOOORRRRRGGGGÄÄÄÄÄÄHHHHNNNN!";
    	char* a = buf, *b = a + 1;
    	setlocale ( LC_ALL, "german" );
    	while ( *a ) {
    		while ( *a == *b ) {
    			while ( *b )
    				*b = *( b + 1 ), b++;
    			b = a + 1;
    		}
    		b = ++a + 1;
    	}
    	puts ( buf );
    	return 0;
    }
    


  • Naja, das entspricht aber nicht so ganz dem gewünschten. Die Lösung erkennt "doppelte" Zeichen ja nur, wenn sie direkt hintereinander erscheinen.

    Wenn mit "doppelt" einfach nur "mehrfach" gemeint ist, könnte man das relativ simpel so machen: sobald ein Zeichen das erste Mal vorkommt, merkst du dir dies irgendwo. Für jedes Zeichen überprüfst du dann einfach, ob es schonmal vorkam. Wenn nein, gibst du es aus und markierst es als erledigt.

    z.B. Zeichen "a" kommt zum ersten Mal vor, du merkst dir:
    mein_gedaechtnis['a'] = 1

    Bei zukünftigen Zeichen fragst du dann immer dein Gedächtnis, ob es das Zeichen schonmal gesehen hat. Einige (äußerst wichtige) Dinge musst du bei dem ganzen natürlich beachten, aber ein bisschen knobeln macht ja auch Spaß.



  • heißt das es wäre ganz einfach mit

    char *word;
    int counter = 0;
    for (i = 0; i < strlen(input); i++)
    {
      counter = 0;
    
      for (j = 0; j < strlen(input); j++)
      {
        if (input[j] == input[i] && j != i && counter == 0)
        {
          counter = 1;
          word += input[i];
    
        }
      }
    }
    

    lösbar?

    hab leider gerade keine möglichkeit das auszuprobieren..



  • ungetestet:

    char found[256] = {0};
    int i;
    
    for(i = 0; i < strlen(input); ++i)
    {
      if(!found[input[i]])
      {
         putc(input[i]);
         found[input[i]] = 1;
      }
    }
    


  • int main()
    {
      char buf[] = "GGGGGGUUUUUUUDDDÄÄÄÄÄNNN MMMMMOOOOOORRRRRGGGGÄÄÄÄÄÄHHHHNNNN!", *p=buf, c;
      while ( *p )
        if( c=*p,*p++=0,!strchr(buf,c) )
          buf[strlen(buf)]=c;
      puts(buf);
      return 0;
    }
    


  • Schmeckt's? Ein Stück Brot dazu?

    #include <stdio.h>
    #include <locale.h>
    
    int main ( void )
    {
    	unsigned char buf [ ] = "Aufgabe nicht verstanden, sechs setzen! Mööööp, möööp!", merker [ 256 ] = { 0 }, *s;
    	setlocale ( LC_ALL, "german" );
    	for ( s = buf; *s; s++ ) 
    		if ( ! merker [ *s ] )
    			putchar ( *s ), merker [ *s ] = 1;
    	return 0;
    }
    

Log in to reply