Zeilen einlesen

#1
Guten Tag liebes Forum,

ich habe ein kleines Programm geschrieben, das bis auf einen Fehler gut funktioniert.
Diesen wuerde ich aber auch noch gerne beseitigen und vllt koennt ihr mir dabei helfen.


Das programm soll die Anzahl der abcxyz ausgeben und dann noch die Characters ABC - xyz in geordneter Reihenfolge.
in etwa so : AAABCDDDDDEFFFGGGGGGGHIIIIII...aaaaaaabbbcddddeeeffffffg.... - ....xxxyzzzzz
Je nachdem wie oft das jeweilige Zeichen aus dem Alphabet in der eingelesenen Textzeile vorkommt.

Das Problem ist nun, das die zeichen nicht korrekt ausgegeben werden, da Sie wenn sie zB 2 mal vorkommen,
nur 1 mal ausgegeben werden.

Ich freue mich auf eure Antworten.

LG Malte

Hier der sc:

C:
#include "readline.h"
#include <stdio.h>
#include <string.h>



void printCharA(int* alpha, unsigned int alphasize)
{
    //Bubblesort
    char alph = 'a';
    char xlph = 'x';
    for(int h = 0; h <= 25; h++)
    {
        int c;
        c = alpha[h];
        char alphabet = 'A' + h;
        while(c != 0)
        {
            c--;
            printf("%c\n", alphabet);
        }
        /*for(int k = 0; k <= c; k++)
        {
            if(c > 0)
            {
                printf("%c\n", alphabet);
            }
        }*/
    }
    for(int k = 0; k <= 25; k++)
    {
        int d;
        d = alpha[k];
        char alphabet = 'a' + k;
        while(d != 0)
        {
            d--;
            printf("%c\n", alphabet);
        }
    }
    for(int g = 0; g <= 2; g++)
    {
        printf("%i -- %c\n", alpha[32 + g], alph + g);
    }  
    for(int g = 0; g <= 2; g++)
    {
        printf("%i -- %c\n", alpha[55 + g], xlph + g);
    }
   
   
   
}

void charRunner(char* zk)
{
    int alpha[58];
    for(int i = 0; i <= 58; i++)
    {
        alpha[i] = 0;
    }
    for(char* p = zk; *p != '\0'; p += 1)
    {
        alpha[*p - 65]++;
    }
    printCharA(alpha, 58);
}

int main()
{
    char zk[100] = "";
   
    printf("enter a line of text:\t");
    readLine( zk, 100);
    charRunner(zk);

   
   

    return 0;
}
 
Zuletzt bearbeitet:

German

Well-Known Member
c-b Experte
#2
Wow, nicht so kompliziert. Lege ein Array mit 256 Elementen an. Jedes Element ist ein Counter. Der Wert des jeweiligen char ist der Index im Array, bei dem du hochzählst. Somit ist das bereits sortiert und die Zeitkomplexität bleibt bei O(n).
C:
#include <stdio.h>

int main(void)
{
  const char text[] = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr,"
                      " sed diam nonumy eirmod tempor invidunt ut labore et dolore"
                      " magna aliquyam erat, sed diam voluptua. At vero eos et accusam"
                      " et justo duo dolores et ea rebum. Stet clita kasd gubergren,"
                      " no sea takimata sanctus est Lorem ipsum dolor sit amet.";
  unsigned counters[256] = {0};
  const unsigned *pElement = counters;
  int ch = 0;

  printf("%s\n\n", text);

  for (const unsigned char *it = (const unsigned char*)text; (ch = *it); it++, counters[ch]++);

  for (int i = 0; i < 256; ++i, ++pElement)
    if (*pElement)
      printf("'%c'%11u\n", i, *pElement);

  return 0;
}
 
#4
Wow, nicht so kompliziert. Lege ein Array mit 256 Elementen an. Jedes Element ist ein Counter. Der Wert des jeweiligen char ist der Index im Array, bei dem du hochzählst. Somit ist das bereits sortiert und die Zeitkomplexität bleibt bei O(n).
C:
#include <stdio.h>

int main(void)
{
  const char text[] = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr,"
                      " sed diam nonumy eirmod tempor invidunt ut labore et dolore"
                      " magna aliquyam erat, sed diam voluptua. At vero eos et accusam"
                      " et justo duo dolores et ea rebum. Stet clita kasd gubergren,"
                      " no sea takimata sanctus est Lorem ipsum dolor sit amet.";
  unsigned counters[256] = {0};
  const unsigned *pElement = counters;
  int ch = 0;

  printf("%s\n\n", text);

  for (const unsigned char *it = (const unsigned char*)text; (ch = *it); it++, counters[ch]++);

  for (int i = 0; i < 256; ++i, ++pElement)
    if (*pElement)
      printf("'%c'%11u\n", i, *pElement);

  return 0;
}
Denkst du damit hast du mir geholfen?
 
#7
In wie weit hat dir das denn nicht geholfen ?
Ich konnte mit den meisten Sachen garnichts anfangen.

aber vielleicht koennt ihr mir ja hier weiterhelfen:
Das Programm funktioniert nun wunderbar aber am Ende bricht es mit einer Fehlermeldung ab.
So schlimm ist das jetzt nicht, da ja alle funktionen abgerufen werden, aber ohne eine Fehlermeldung am
Ende waere es halt schoener.

Zuletzt seht ihr im sc die Funktion Readline

Code:
#include "readline.h"
#include <stdio.h>
#include <string.h>



void printCharA(int* alpha, unsigned int alphasize)
{
    //printRowAlphabetgr
    for(int i = 0; i <= 25; i++)
    {   
        for(int k = 1; k <= alpha[i]; k++)
        {
            char a = 'A' + i;
            printf("%c", a);
        }
    }

    //printRowAlphabetkl
    for(int i = 32; i <= 58; i++)
    {   
        for(int k = 1; k <= alpha[i]; k++)
        {
            char a = 'A' + i;
            printf("%c", a);
        }
    }
    
    printf("\n");

    //printAbcxyz
    char alph = 'a';
    char xlph = 'x';
    for(int g = 0; g <= 2; g++)
    {
        printf("%i -- %c\n", alpha[32 + g], alph + g);
    }   
    for(int g = 0; g <= 2; g++)
    {
        printf("%i -- %c\n", alpha[55 + g], xlph + g);
    }   
}

void charRunner(char* zk)
{
    int alpha[58];
    for(int i = 0; i <= 58; i++)
    {
        alpha[i] = 0;
    }
    for(char* p = zk; *p != '\0'; p += 1)
    {
        alpha[*p - 65]++;
    }
    printCharA(alpha, 58);
}

int main()
{
    char zk[100] = "";
    
    printf("enter a line of text:\t");
    readLine( zk, 100);
    charRunner(zk);

    
    

    return 0;
}

hier die Funktion readLine

#ifndef READLINE_H
#define READLINE_H

#include <stdio.h>

void readLine( char* strbuffer, unsigned int buffersize )
{
  char format[30] = "";
  sprintf( format, "%%%u[^\n]%%*c", buffersize-1 );
  scanf( format, strbuffer );
}

#endif
es waere super wenn ihr euch auf mein Problem beziehen koenntet, damit ich es auch verstehe

LG Malte
 
Oben