C Programmierung: Zweidimensionale Arrays und Pointer?

Guten Tag,

ich hätte ein paar Fragen zu Pointern im Bezug auf zweidimensionale Arrays und Pointer. Zuerst wollte ich fragen, ob mir jemand die Syntax hinter Pointern für mehrdimensionale Arrays in C erklären kann?

Wenn ich einen Array habe, wie bspw.:

int ary[2][3] = { {1, 2, 3}, {4, 5, 6} };

Nun möchte ich einen Pointer auf diesen Array:

int (*p1)[3] = ary; // Pointer auf int Array der Länge 3
int (*p2)[2][3] = &ary; // Pointer auf 2 dim Array der aus 2 int Arrays der Länge 3 besteht.

Warum werden hier die Indizes hinter dem Pointer geschrieben und nicht etwas wie:

int[2][3] *p2

Wäre das nicht intuitiver? Gibt es hinter der Schreibweise einen logischen Sinn?

Eine weitere Frage zur Syntax wäre, wie man das korrekt aufschreibt, wenn man einen return Value oder einen Funktionsprototypen aus einem Pointer zu einem zweidimensionalen Arrays (mit klar definierter Größe) haben möchte?

Dazu wollte ich noch sichergehen, dass meine Vermutung, warum ich für die Zuweisung bei p2 noch ein & davor hängen muss, die Richtige ist. ary und &ary sind exakt die selben Pointer. Ist es so, weil ary als Pointer auf einen int Array der Länge 3 hinterlegt ist und &ary sozusagen ein Pointer auf einen zweielementigen Array ist, der aus int Arrays der Länge 3 besteht?

Über eine Antwort würde ich mich sehr freuen!

Computer, Technik, programmieren, Informatik, C (Programmiersprache)
Wahrheitstabelle ausgeben in C?

Hallo zusammen,

Das ist meine Aufgabe, die ich in der Uni lösen muss, allerdings habe ich ein Problem und es werden statt 16 Zeilen bei mir nur zwei Zeilen ausgegeben.

#include <stdio.h>


int main(void)
{
    int schritte = 0;
    int a, b, c, d, e, f, g, h, i;
    a = 0;
    b = 0;
    c = 0;
    d = 0;


    printf(" | A | B | C | D || E | G | H | I | F |\n");
    printf("-+---+---+---+---++---+---+---+---+---+-\n");


    while(schritte <= 16)
    {
        while(a <= 1)
        {
            while(b <= 1)
            {
                while(c <= 1)
                {
                    while(d <= 1)
                    {
                        e = a && -b;
                        g = c || -d;
                        h = -e || g;
                        i = a || b || d;
                        f = h==i;


                        printf(" |%d |%d | %d |%d ||%d |%d |%d |%d |\n", a, b, c, d, e, g, h, i, f);
                        
                        d++;
                    }


                    c++;
                }


                b++;    
            }
                  
            a++;
        }


        schritte++;
    }
}

als Ausgabe bekomme ich dann nur das:

| A | B | C | D || E | G | H | I | F |
-+---+---+---+---++---+---+---+---+---+-
 |0 |0 | 0 |0 ||0 |0 |0 |0 |
 |0 |0 | 0 |1 ||0 |1 |1 |1 |

muss da noch bisschen mit dem Abstand rumspielen aber vom Prinzip her passt es ja, nur leider nur mit den zwei Zeilen.

Danke im Vorraus!

Bild zu Frage
Computer, Studium, Schule, programmieren, Informatik, C (Programmiersprache)
Count Sort Funktion geht zu früh aus der Schleife?

Ich möchte ein Programm schreiben, dass ein Array mit Count Sort sortieren soll. Doch habe ich einen Fehler. Meine Eingabe für das unsortierte Array war:

38 38 19 57 0 18 59 27 18 57 19 47 4 2 5 5 1 1 

Aber als Ausgabe bekam ich bloß:

 0 1 1 2 4 5 5 0 0 0 0 0 0 0 0 0 0 0

Für dieses Programm sind besonders 2 Funktionen wichtig und ich denke, dass in einen der Beiden mein Fehler ist. Hier ist meine erste Funktion fürs Zählen:

void count(int input_array[], int len, int count_array[]) 
{
	for (i=0; i < len; i++) 
	{
		count_array[i] = 0;
    }
	for (j=0; j<len;j++) 
	{
		count_array[input_array[j]]++;
    }
}

Meine erste For-schleife soll sagen, dass count_array min. 38 Stellen lang sein soll und soll überall mit 0 initialisierst werden. "len" steht für Länge und ist 38.

Die zweite for-Schleife soll das eigentliche Nachzählen tun. zBs. bei j=1 sollte die for-Schleife also im output_array eine 38 finden. Also soll count_array bei der Stelle 38 um eins erhöhen. Das gleiche mit j=2 usw.

Und meine zweite Funktion soll nun das output Array schreiben, welches richtig sortiert ist. k ist der Index im output_array. k ist der Index. Die erste for-Schleife soll das count_array durchgehen und die zweite for-Schleife soll das schreiben der Zahl so oft wiederholen, wie häufig diese gefunden wurde.

void write_output_array(int output_array[], int len, int count_array[]) 
{
	k=0;
    for (j=0; j < len; j++) 
	{
		for (i=0; i < count_array[j]; i++) 
		{
			output_array[k] = j;
			k++;
		}
	}
}

Hat jemand eine Idee warum write_output_array wohl früher endet als gewollt?

Computer, programmieren, CC, Informatik, C (Programmiersprache), Sortieralgorithmus
Taschenrechner in C: Könnt ihr mir bei der Überprüfung des Operators helfen?

Hallo Community,

ich bräuchte Hilfe bei meinem C-Code. Ich komme nicht weiter bei der Überprüfung vom Taschenrechner. Ich möchte, dass der Operator überprüft werden soll. Sprich bei allen anderen Buchstaben außer A, S, M, D soll der Benutzer eine neue Angabe machen.

Hier mein Code:

int main()
{
  // Deklarierung der Variablen
  char auswahl;
  float zahl1, zahl2;
  float ergebnis;

  // Auswahl vom Rechenoperator
  printf("Wie moechtest du Rechnen?\n");
  printf("(a) Addieren\n");
  printf("(s) Subtrahieren\n");
  printf("(m) Multiplizieren\n");
  printf("(d) Dividieren\n");
  scanf("%c", &auswahl); // %c für char Variablen

  while () {
    if (auswahl != 'a' || 's' || 'm' ||'d') {
      printf("\nFalsche Eingabe. Waehle eine neue:");
    }
  }

  // Eingabe der Zahlen
  printf("Gib deine erste Zahle ein: ");
  scanf("%f", &zahl1);
  printf("Gib deine zweite Zahle ein: ");
  scanf("%f", &zahl2);

  // Auswahl-Auswertung vom Benutzer
  switch (auswahl) {
    case 'a':
      ergebnis = zahl1 + zahl2;
      break;
    case 's':
      ergebnis = zahl1 - zahl2;
      break;
    case 'm':
      ergebnis = zahl1 * zahl2;
      break;
    case 'd':
      ergebnis = zahl1 / zahl2;
      break;
    default:
      break;
  }

  // Ergebnisasugabe
  if (auswahl == 'a') {
    printf("\nErgebnis:\n%.1f + %.1f = %.1f", zahl1, zahl2, ergebnis);
  }

  if (auswahl == 's') {
    printf("Ergebnis:\n%.1f - %.1f = %.1f", zahl1, zahl2, ergebnis);
  }

  if (auswahl == 'm') {
    printf("Ergebnis:\n%.1f * %.1f = %.1f", zahl1, zahl2, ergebnis);
  }

  if (auswahl == 'd') {
    printf("Ergebnis:\n%.1f / %.1f = %.1f", zahl1, zahl2, ergebnis);
  }

  printf("\n\n");
  return 0;
}
Computer, programmieren, Informatik, Programmiersprache, C (Programmiersprache)
Wie kann ich eine Zeichenkette in einem String suchen und ersetzen?

Hallo zusammen,

ich möchte ein C-Programm schreiben, in der ein String durch scanf eingelesen wird.

In dem String ist eine Buchstabenkombination "ax", die durch "53" ersetzt werden soll. Die Kombination "ax" soll ersetzt werden, nicht aber "a" oder "x" oder "xa".

Ich habe da schon einmal etwas versucht. Jedoch lassen sich die Buchstaben ersetzen, aber willkürlich.

Ich bitte um Hilfe.

Hinweis: Ich darf keine C-Funktionen aus der Bibliothek string.h verwenden:

MfG

Julian Lindemeyer

char Einlesen[16];
char nachaxdurchsuchen[2] = "ax";
char durch53ersetzen[2] = "53";
int matrikelnummer = 742152;
char suchenundersetzen1;
char suchenundersetzen3;
char suchenundersetzen2;
char suchenundersetzen4;
int k, l;
  
printf("Bitte geben sie das Suchzeichen ein\n");
scanf("%s", nachaxdurchsuchen);

printf("Bitte geben sie das Ersatzzeichen ein\n");
scanf("%s", durch53ersetzen);

printf("Bitte geben sie den String ein, indem gesucht werden soll\n");
scanf("%s", Einlesen);

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

suchenundersetzen1 = nachaxdurchsuchen[0];
suchenundersetzen2 = durch53ersetzen[0];
suchenundersetzen3 = nachaxdurchsuchen[1];
suchenundersetzen4 = durch53ersetzen[1];

int AnzahlderZeichenketteimString = 0;

while (Einlesen[AnzahlderZeichenketteimString] != '\0') {
  AnzahlderZeichenketteimString++;
}

int j, i;

for (i = 0; i < AnzahlderZeichenketteimString; i++) {
  if (Einlesen[i] == suchenundersetzen1) {
    Einlesen[i] = suchenundersetzen2;
  }

  for (j = 0; j < AnzahlderZeichenketteimString; j++) {
    if (Einlesen[j] == suchenundersetzen3) {
      Einlesen[j] = suchenundersetzen4;
    }
  }

  printf("%c%c", Einlesen[i], Einlesen[j]);
}
Computer, Informatik, C (Programmiersprache)
C: Wie kann ich ein Pointer-Array anlegen, um die Fundstellen zu speichern?

/* 24_02 dynamische Speicherverwaltung
   demonstriert realloc
   ZUR BEACHTUNG: Dies ist ein reines Demo-Programm!
                  Speicher-Reallokation in 10-Byte-Blöcken ist in der Praxis nicht sinnvoll!
                  Speicherallokation und insbesondere Speicher-Reallokation kosten erhebliche System-Resourcen!
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STRLEN 10

int Such(char* strPtr, char* Ptr2);

int main()
{
  int n = 1;
  char* strPtr = (char*)malloc(n * STRLEN); // kleinen Speicherblock anfordern
  char* strPtr2 = (char*)malloc(n * STRLEN); // kleinen Speicherblock anfordern
  printf("Bitte Text eingeben: \n");
  fgets(strPtr, STRLEN, stdin); // einlesen
  printf("\n");

  while (strPtr[strlen(strPtr) - 1] != '\n') // Ende erreicht, letztes Zeichen '\n'?
  {
    n++; // Anzahl Blöcke inkrementieren
    strPtr = (char*)realloc(strPtr, n * STRLEN); // größeren Speicher anfordern: n Blöcke
    fgets(strPtr + strlen(strPtr), STRLEN + 1, stdin); // weiter einlesen, terminierende 0 überschreiben, STRLEN + 1 Byte stehen zur Verfügung
  }

  printf("Nach welcher Zeichenfolge soll gesucht werden?\n");
  fgets(strPtr2, STRLEN, stdin); // einlesen
  printf("\n");

  while (strPtr2[strlen(strPtr2) - 1] != '\n') // Ende erreicht, letztes Zeichen '\n'?
  {
    n++; // Anzahl Blöcke inkrementieren
    strPtr2 = (char*)realloc(strPtr2, n * STRLEN); // größeren Speicher anfordern: n Blöcke
    fgets(strPtr2 + strlen(strPtr2), STRLEN + 1, stdin); // weiter einlesen, terminierende 0 überschreiben, STRLEN + 1 Byte stehen zur Verfügung
  }

  printf("Zeichenfolge wurde %i mal gefunden\n", Such(strPtr, strPtr2));
  return 0;
}

int Such(char* strPtr, char* strPtr2)
{
  int n = 0;
  int p = 0;
  int sip = 0;

  int ltext = strlen(strPtr) - 1;
  int lzfolge = strlen(strPtr2) - 1;
  int lgteilt = ltext / lzfolge;
  char* ptrarr[] = { NULL };

  while ((lgteilt) > 0)
  {
    for (int i = 0; i < lzfolge; i++)
    {
      if (strPtr[p] == strPtr2[i])
      {
        sip++;
      }

      p++;
    }

    lgteilt--;
  }

  return (sip / lzfolge);
}

Ich verstehe leider nicht ganz, wie man ein Pointer-Array anlegen soll, um die Fundstellen zu speichern.

Ich habe zwar eine Schleife, aber diese kann z. B. "yay" nicht mit "ay" vergleichen.

Danke für die Hilfe.

Bild zu Frage
Computer, Technik, programmieren, Technologie, C (Programmiersprache)
Was ist der Tastaturpuffer?

Hallo,

Ich lerne gerade C für mein Studium und wir arbeiten mit scanf. Unser Prof hat das Thema Tastaturpuffer aber leider nicht richtig erklärt und ich stehe dementsprechend auf dem Schlauch.

Hier ist die ganze Sache ja noch sehr verständlich.

Eine Zahl wird eingelesen. Diese Eingabe wird mit \n bestätigt. Das in der letzten Zeile eingegeben \n befindet sich in diesem Tastaturpuffer und  wird jetzt automatisch im zweiten scanf eingegeben. Damit wird dieses scanf "Übersprungen" und der Variable "Dummy" das \n  zugewiesen.

EIne Zahl und ein Zeichen wird eingelesen. Wenn jetzt sowohl das Zeichen als auch das \n in dem Tastaturpuffer gespeichert ist, dann müsste ich eine 7 ein A und einen Zeilenumbruch aus Ausgabe bekommen. Das Passiert aber nicht.

Wenn nur das A in dem Tastaturpuffer gespeichert ist, dann müsste ich eine 7 ein A und die möglichkeit erhalten, ein neues Zeichen einzugeben. Das Passiert aber auch nicht.

Stattdessen erhalt ich einfach nur eine 7 und ein A und der Code wird beendet. Warum?

Hier die beiden Codes:

#include <stdio.h>

int main(){

    int Zahl;

    char Dummy;

    printf("geben Sie bitte eine ganze Zahl ein:");

    scanf("%d", &Zahl);                                         .

    scanf("%c", &Dummy);                                        

    printf("%c", Dummy);                                        

    return 0;

}

Und

#include <stdio.h>

int main(){

    int Zahl;

    char Dummy2;

    char Dummy;

    printf("\ngeben Sie bitte eine ganze Zahl und ein Zeichen ein:");

    scanf("%d", &Zahl);                                                 

    printf("%d", Zahl);

    scanf("%c", &Dummy);                                               

    printf("%c", Dummy);                                             

    scanf("%c", &Dummy2);                                                

    printf("%c", Dummy2);

    return 0;

}

Bild zu Frage
Computer, Schule, programmieren, C (Programmiersprache)

Meistgelesene Fragen zum Thema C (Programmiersprache)