C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive]

Diskutiere C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] im Developer Network Forum im Bereich Hardware & Software Forum; Servus miteinander! Ich habe mir paar YouTube-Videos angeguckt. War z. B. ein Beispiel mit 2 Zeigern. Den Anfang mit den Vorgaben habe ich mir...
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #1
D

Data2006

Bekanntes Mitglied
Dabei seit
26.11.2017
Beiträge
56
Reaktionspunkte
0
Servus miteinander!

Ich habe mir paar YouTube-Videos angeguckt. War z. B. ein Beispiel mit 2 Zeigern.
Den Anfang mit den Vorgaben habe ich mir noch angeguckt. Rest wollte ich selber probieren. Bin an ner Fehlerstelle nicht weitergekommen.

Ausgang war eine Zeichenkette char b[] = "serf123 345;.456 sfjhfg 345";
Aus diesem String sollten die Zahlen rausgefiltert werden und in ein Array mit int-Zahlen geschrieben werden. Dazu eine Funktion int *p = leseZahlen(b);
Ich habe dann verschiedenes ausprobiert. Z. B.:

#include <iostream>
#include <string.h>
using namespace std;
int main(void)
{

char b[] = "serf123 345;.456 sfjhfg 345";
char zahlenarray[5] = " ";
int i = 0;
for(int y= 0; y <= strlen(b); y++)
{
cout << endl << y << " = " << b[y];
strcat(zahlenarray, b);
}

Ich wollte aus dem Array b erstmal jedes Zeichen/Zahl auslesen. Und hintereinander in zahlenarray reinschreiben. Zuerst hatte ich eine Verknüpfung mit zahlenarray=zahlenarray+b bzw. & zur Verknüpfung probiert. Bei VB ging das wohl so. Dann habe ich strcpy probiert. Dann bin ich bei strcat gelandet:
strcat(zahlenarray, b); //[Error] invalid conversion from 'char' to 'const char*' [-fpermissive]

52 18 C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include\string.h [Note] initializing argument 2 of 'char* strcat(char*, const char*)'

Was sagen mir jetzt die Fehler?
Kann ich nicht aus b die einzelnen Zeichen rauskopieren und mit strcat neu ablegen?


Vorher habe ich auch ein while(...) probiert:
int* leseZahlen(char a[])
{
char zahlenarray[5] = " ";
int i = 0;
while (a != 0)
{
if(a >= '0' && a <= '9')
{
cout << endl << a;
strcat(zahlenarray, a);
i++;
}
a++;

Da ging es auch nicht. Und ich konnte den Zeiger nicht weiterspringen lassen
a++;

Paar Variablen a und b für die Zeichenkette und i und y zum Zählen vertauscht. Sollte aber nicht das Problem sein.

Wie komme ich jetzt ohne das Video weiter gucken zu müssen an eine Lösung?

Vielen Dank.

LG
Data2006
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #2
BigReaper

BigReaper

Bekanntes Mitglied
Dabei seit
04.01.2002
Beiträge
101
Reaktionspunkte
0
Hi,
vielleicht so was? :
Code:
#include <iostream>
#include <string.h>

using namespace std;
int main(void)
{
  char b[] = "serf123 345;.456 sfjhfg 345";
  int zahlenarray[256];
  char *ptr;
  int *i_ptr;
  int  anzahlZahlenarray = 0;

  for(ptr = b, i_ptr = zahlenarray; *ptr; ptr++)
  {
    if ((*ptr >= '0') && (*ptr <= '9'))
    {
      *i_ptr++ = *ptr - '0';
      anzahlZahlenarray++;
    }
  }

  for(int i = 0; i < anzahlZahlenarray; i++)
  {
    cout << zahlenarray[i] << endl;
  }
}
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #3
D

Data2006

Bekanntes Mitglied
Dabei seit
26.11.2017
Beiträge
56
Reaktionspunkte
0
Hi,
vielleicht so was? :
Code:
#include <iostream>
#include <string.h>

using namespace std;
int main(void)
{
  char b[] = "serf123 345;.456 sfjhfg 345";
  int zahlenarray[256];
  char *ptr;
  int *i_ptr;
  int  anzahlZahlenarray = 0;

  for(ptr = b, i_ptr = zahlenarray; *ptr; ptr++)
  {
    if ((*ptr >= '0') && (*ptr <= '9'))
    {
      *i_ptr++ = *ptr - '0';
      anzahlZahlenarray++;
    }
  }

  for(int i = 0; i < anzahlZahlenarray; i++)
  {
    cout << zahlenarray[i] << endl;
  }
}

Hi BigReaper,

vielen Dank für Deine Antwort. Sieht fast richtig aus. Es sollten aber nur die Ziffern zusammenhängend in jeweils einer Zahl in ein Array geschrieben werden: 123, 345, 456, 345. Sind 4 Zahlen für zahlenarray.

Die Ziffern einzeln auszugeben hatte ich schon hinbekommen, aber nicht in den Zahlen.

Muß auch zugeben das ich Deine Lösung mit den Pointern nicht ganz verstanden habe :-(((

Vielen Dank,
Data2006
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #4
D

Data2006

Bekanntes Mitglied
Dabei seit
26.11.2017
Beiträge
56
Reaktionspunkte
0
Hi BigReaper,

vielen Dank für Deine Antwort. Sieht fast richtig aus. Es sollten aber nur die Ziffern zusammenhängend in jeweils einer Zahl in ein Array geschrieben werden: 123, 345, 456, 345. Sind 4 Zahlen für zahlenarray.

Die Ziffern einzeln auszugeben hatte ich schon hinbekommen, aber nicht in den Zahlen.

Muß auch zugeben das ich Deine Lösung mit den Pointern nicht ganz verstanden habe :-(((

Vielen Dank,
Data2006

PS: Ich verstehe nur noch immer nicht warum mein strcat(zahlenarray, a); nicht funktioniert hat *heulheul*
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #5
BigReaper

BigReaper

Bekanntes Mitglied
Dabei seit
04.01.2002
Beiträge
101
Reaktionspunkte
0
Hi,
ich glaube das ich die Aufgabe jetzt verstanden habe ;)
Code:
#include <iostream>
#include <string.h>

using namespace std;

int leseZahlen(char *string, int *zahlenArray)
{
  char *ptr;
  int  *ptr_Zahlenarray;
  int   anzahlZahlen = 0;
  int   lokaleIntegerZahl = 0;
  bool  neueZahl = false;

  ptr             = string;
  ptr_Zahlenarray = zahlenArray;

  while(*ptr)
  {
    if ((*ptr >= '0') && (*ptr <= '9'))
    {
      if (neueZahl == false)
      {
        lokaleIntegerZahl = 0;
        anzahlZahlen++;
        neueZahl = true;
      }

      lokaleIntegerZahl *= 10;
      lokaleIntegerZahl += *ptr - '0';
    }
    else if ((*ptr <= '0') || (*ptr >= '9'))
    {
      if (neueZahl)
      {
        *ptr_Zahlenarray++ = lokaleIntegerZahl;
        neueZahl = false;
      }
    }
    ptr++;
  }

  if (neueZahl)
  {
    *ptr_Zahlenarray++ = lokaleIntegerZahl;
  }

  return anzahlZahlen;
}

int main(void)
{
  char b[] = "serf123 345;.456 sfjhfg 345";
  int zahlenarray[5];
  int  anzahlZahlenarray = 0;
 
  anzahlZahlenarray = leseZahlen(b, zahlenarray);
 
  for(int i = 0; i < anzahlZahlenarray; i++)
  {
    cout << zahlenarray[i] << endl;
  }
}
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #6
D

Data2006

Bekanntes Mitglied
Dabei seit
26.11.2017
Beiträge
56
Reaktionspunkte
0
Hi,
ich glaube das ich die Aufgabe jetzt verstanden habe ;)
Code:
#include <iostream>
#include <string.h>

using namespace std;

int leseZahlen(char *string, int *zahlenArray)
{
  char *ptr;
  int  *ptr_Zahlenarray;
  int   anzahlZahlen = 0;
  int   lokaleIntegerZahl = 0;
  bool  neueZahl = false;

  ptr             = string;
  ptr_Zahlenarray = zahlenArray;

  while(*ptr)
  {
    if ((*ptr >= '0') && (*ptr <= '9'))
    {
      if (neueZahl == false)
      {
        lokaleIntegerZahl = 0;
        anzahlZahlen++;
        neueZahl = true;
      }

      lokaleIntegerZahl *= 10;
      lokaleIntegerZahl += *ptr - '0';
    }
    else if ((*ptr <= '0') || (*ptr >= '9'))
    {
      if (neueZahl)
      {
        *ptr_Zahlenarray++ = lokaleIntegerZahl;
        neueZahl = false;
      }
    }
    ptr++;
  }

  if (neueZahl)
  {
    *ptr_Zahlenarray++ = lokaleIntegerZahl;
  }

  return anzahlZahlen;
}

int main(void)
{
  char b[] = "serf123 345;.456 sfjhfg 345";
  int zahlenarray[5];
  int  anzahlZahlenarray = 0;
 
  anzahlZahlenarray = leseZahlen(b, zahlenarray);
 
  for(int i = 0; i < anzahlZahlenarray; i++)
  {
    cout << zahlenarray[i] << endl;
  }
}

SUPER!!! Vielen Dank. Klappt voll. Habe nur nicht ganz verstanden wie. Ist aber erst mal egal.

Warum funktioniert meine Lösung nur wenn ich am Stringende noch ein anderes Zeichen einfüge?
Code:
// rein:
// "serf123 345;.456 sfjhfg 345"
// raus: 
// {123, 345, 456, 345}
#include <iostream>
#include <string.h>
using namespace std;
int main(void)
{
 char b[] = "serf123 345;.456 sfjhfg 345";
 int anzahl_zahlen = 0;
 int zahlenarray[] = {0, 0, 0, 0, 0};
 int index_zahlenarray = 0;
 bool istZahl = false;

 for(int i = 0; i < strlen(b); i++)
 {
 if(b[i] >= '0'  && b[i] <= '9')
 {
 istZahl = true;
 zahlenarray[index_zahlenarray] += b[i] - 48;
 
 if(b[i + 1] >= '0'  && b[i + 1] <= '9')
 {
 zahlenarray[index_zahlenarray] *= 10;
 }
 }
 else
 {
 if( (! (b[i] >= '0' && b[i] <= '9') && istZahl == true))
 {
 index_zahlenarray++;
 anzahl_zahlen++;
 istZahl = false;
 }
 }
 }
 
 cout << endl << "Anzahl der Zahlen = " << anzahl_zahlen;
 
 cout << endl << endl << "Die Zahlen:";
 
 for(int i = 0; i < anzahl_zahlen; i++)
 {
 cout << endl << zahlenarray[i];
 }
 
 return 0;
}

Anzahl der Zahlen = 3
Die Zahlen:
123
345
456
--------------------------------
Process exited after 0.2394 seconds with return value 0
Drücken Sie eine beliebige Taste . . .

Das letzte Zeichen fehlt irgendwie. Oder?
Wo ist bei mir der Denkfehler?
Mache ich
char b[] = "serf123 345;.456 sfjhfg 345_";
funktioniert meine Lösung.

Danke!
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #7
D

Data2006

Bekanntes Mitglied
Dabei seit
26.11.2017
Beiträge
56
Reaktionspunkte
0
PS: Das ganze (von mir) in eine Funktion gepackt. Dann habe ich genug mit der Übung getan.
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #8
D

Data2006

Bekanntes Mitglied
Dabei seit
26.11.2017
Beiträge
56
Reaktionspunkte
0
SUPER!!! Vielen Dank. Klappt voll. Habe nur nicht ganz verstanden wie. Ist aber erst mal egal.

Warum funktioniert meine Lösung nur wenn ich am Stringende noch ein anderes Zeichen einfüge?
Code:
// rein:
// "serf123 345;.456 sfjhfg 345"
// raus:
// {123, 345, 456, 345}
#include <iostream>
#include <string.h>
using namespace std;
int main(void)
{
 char b[] = "serf123 345;.456 sfjhfg 345";
 int anzahl_zahlen = 0;
 int zahlenarray[] = {0, 0, 0, 0, 0};
 int index_zahlenarray = 0;
 bool istZahl = false;

 for(int i = 0; i < strlen(b); i++)
 {
 if(b[i] >= '0'  && b[i] <= '9')
 {
 istZahl = true;
 zahlenarray[index_zahlenarray] += b[i] - 48;
 
 if(b[i + 1] >= '0'  && b[i + 1] <= '9')
 {
 zahlenarray[index_zahlenarray] *= 10;
 }
 }
 else
 {
 if( (! (b[i] >= '0' && b[i] <= '9') && istZahl == true))
 {
 index_zahlenarray++;
 anzahl_zahlen++;
 istZahl = false;
 }
 }
 }
 
 cout << endl << "Anzahl der Zahlen = " << anzahl_zahlen;
 
 cout << endl << endl << "Die Zahlen:";
 
 for(int i = 0; i < anzahl_zahlen; i++)
 {
 cout << endl << zahlenarray[i];
 }
 
 return 0;
}

Anzahl der Zahlen = 3
Die Zahlen:
123
345
456
--------------------------------
Process exited after 0.2394 seconds with return value 0
Drücken Sie eine beliebige Taste . . .

Das letzte Zeichen fehlt irgendwie. Oder?
Wo ist bei mir der Denkfehler?
Mache ich

funktioniert meine Lösung.

Danke!

Ich glaube ich habe den Fehler gefunden. Ich muß ja das letzte Zeichen/Ziffer im String abfragen ob das die letzte Ziffer ist.
Den Code wie folgt ergänzt:
for(int i = 0; i < strlen(b); i++)
{
if(b >= '0' && b <= '9')
{
istZahl = true;
zahlenarray[index_zahlenarray] += b - 48;
if(b[i + 1] >= '0' && b[i + 1] <= '9')
{
zahlenarray[index_zahlenarray] *= 10;
}
if (i == strlen( b ) - 1) //wenn das letzte Zeichen/Ziffer im String eine Ziffer ist, habe ich eine weitere Zahl
{
anzahl_zahlen++; //und muß die Anzahl der Zahlen noch mal um eins erhöhen (inkrementieren)
}
}
else


Was haltet Ihr von meiner Lösung? Zu umständlich?

Danke,
Data2006
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #9
D

Data2006

Bekanntes Mitglied
Dabei seit
26.11.2017
Beiträge
56
Reaktionspunkte
0
Ergänzung:
// rein:
// "serf123 345;.456 sfjhfg 345"
// raus:
// {123, 345, 456, 345}
#include <iostream>
#include <string.h>
using namespace std;
int *leseZahlen(char a[], int *anzahl_zahlen)
{
int zahlenarray[] = {0, 0, 0, 0, 0};
int index_zahlenarray = 0;
bool istZahl = false;

for(int i = 0; i < strlen(a); i++)
{
if(a >= '0' && a <= '9')
{
istZahl = true;
zahlenarray[index_zahlenarray] += a - 48;

if(a[i + 1] >= '0' && a[i + 1] <= '9')
{
zahlenarray[index_zahlenarray] *= 10;
}

if (i == strlen( a ) - 1) //wenn das letzte Zeichen/Ziffer im String eine Ziffer ist, habe ich eine weitere Zahl
{
anzahl_zahlen++; //und muß die Anzahl der Zahlen noch mal um eins erhöhen (inkrementieren)
}
}
else
{
if( (! (a >= '0' && a <= '9') && istZahl == true))
{
index_zahlenarray++;
anzahl_zahlen++;
istZahl = false;
}
}
}

return zahlenarray;
}
int main(void)
{
char b[] = "serf123 345;.456 sfjhfg 345";
int *anzahl_zahlen = 0;
int *p = leseZahlen(b, anzahl_zahlen);

cout << endl << "Anzahl der Zahlen = " << *anzahl_zahlen;

cout << endl << endl << "Die Zahlen:";

for(int i = 0; i < *anzahl_zahlen; i++)
{
cout << endl << p;
}
cin.sync();
cin.get();

return 0;


Hier ist mein Lösungsalgorithmus über eine Funktion. Leider funktioniert sie nicht.
Ich bekomme aber eine [Warning] address of local variable 'zahlenarray' returned [-Wreturn-local-addr] in Zeile 13.
Verstehe ich nicht!
Ich lasse mir in main einen Zeiger *p von der Funktion leseZahlen auf das zahlenarray zurückliefern.
zahlenarray ist in der Funktion ein Vektor mit 5 Elementen. Bei return zahlenarray; müßte doch der Zeiger p (main) auf das erste Element von zahlenarray zeigen. Habe ich doch richtig verstanden?! Sonst kann ich C/C++ direkt wieder sein lassen.

Statt a[i + 1] (usw.) möchte ich später wieder in Zeigerschreibweise *(a + 1) ändern. Das bekomme ich wohl alleine hin.

Danke.

LG
Data2006
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #10
D

Data2006

Bekanntes Mitglied
Dabei seit
26.11.2017
Beiträge
56
Reaktionspunkte
0
Die Schreibweise in der Funktion
int zahlenarray[] = {0, 0, 0, 0, 0};
ist doch richtig?

Ich habe mal gelernt der Name eines Zeigers ist der Zeiger auf sein 1. Element [0]
Also wenn ich schreibe zahlenarray müßte das 1. Element geliefert werden.
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #11
BigReaper

BigReaper

Bekanntes Mitglied
Dabei seit
04.01.2002
Beiträge
101
Reaktionspunkte
0
Hi,
es ist keine gute Idee in Deiner Funktion int *leseZahlen(char a[], int *anzahl_zahlen) die Adresse einer lokalen Variable zurück zu geben. "Besser" wäre es das Array zahlenarray als static zu deklarieren.
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #12
D

Data2006

Bekanntes Mitglied
Dabei seit
26.11.2017
Beiträge
56
Reaktionspunkte
0
Hi,
es ist keine gute Idee in Deiner Funktion int *leseZahlen(char a[], int *anzahl_zahlen) die Adresse einer lokalen Variable zurück zu geben. "Besser" wäre es das Array zahlenarray als static zu deklarieren.
Hi!

Ich habe static int zahlenarray = 0; global geschrieben und in leseZahlen anzahl_zahlen++:
#include <string.h>
using namespace std;
static int anzahl_zahlen = 0;
int *leseZahlen(char a[])

Hat auch nicht geklappt.

Habe aber in leseZahlen aber einen Fehler (?!) gefunden 2x:
*anzahl_zahlen += 1;
Hier erhalte ich in main die richtige anzahl_zahlen=4 raus.

anstatt:
*anzahl_zahlen++;
Hier erhalte ich in main die anzahl_zahlen=0 raus.
Warum klappt hier kein ++? Habe auch mal versucht zu klammern (*anzahl_zahlen)++;
ging auch nicht.

Muß ich in leseZahlen auch statt index_zahlenarray++; index_zahlenarray += 1; schreiben?

LG
Data2006

PS: Falls ich nerven sollte, sorry. Würde nur gerne mein Programm "verstehen".
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #13
D

Data2006

Bekanntes Mitglied
Dabei seit
26.11.2017
Beiträge
56
Reaktionspunkte
0
PS2: wenn ich in leseZahlen vor dem return zahlenarray; ein
cout << endl << "anzahl_zahlen = " << *anzahl_zahlen << " Wert zahlenarray[index_zahlenarray] = " << zahlenarray[index_zahlenarray];
schreibe, erhalte ich die richtige Ausgabe Anzahl 4 und letzte Zahl 345.
Scheint doch return zahlenarray falsch zu sein?! Nur zahlenarray ist doch ein Zeiger mit int Vektoren. Oder nicht? Habe ich ein * oder & wo vergessen?
 
  • C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive] Beitrag #14
D

Data2006

Bekanntes Mitglied
Dabei seit
26.11.2017
Beiträge
56
Reaktionspunkte
0
PS2: wenn ich in leseZahlen vor dem return zahlenarray; ein

schreibe, erhalte ich die richtige Ausgabe Anzahl 4 und letzte Zahl 345.
Scheint doch return zahlenarray falsch zu sein?! Nur zahlenarray ist doch ein Zeiger mit int Vektoren. Oder nicht? Habe ich ein * oder & wo vergessen?

Sorry, ich meinte nicht static int anzahl_zahlen = 0; sondern static int zahlenarray[] = {0, 0, 0, 0, 0, 0};
Das wollte ich in main schreiben. Ging aber nicht. Ins global reingeschrieben, jetzt läuft das Programm.
Wozu dient das static? War eine Speicherklasse o. ä. ?
Wäre schön wenn meine anderen Fragen (u. a. strcat(…) und *anzahl_zahlen++;) noch beantwortet würden.

Ganz vielen lieben Dank,
Data2006
 
Thema:

C++ - Übung mit 2 Zeigern - [Error] invalid conversion from 'char' to 'const char*' [-fpermissive]

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.171
Mitglieder
55.876
Neuestes Mitglied
RamiroGarn
Oben