Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C++] Problem bei Stringverleich (https://www.delphipraxis.net/62741-%5Bc-%5D-problem-bei-stringverleich.html)

3_of_8 8. Feb 2006 19:59


[C++] Problem bei Stringverleich
 
Morgen.

Ich hab einen char op; und will den mit Stringkonstanten vergleichen.

Der Compiler meckert aber dort:

Code:
if(op=="+"||op=="-"||op=="*"||op=="/") break;
Die Fehlermeldung: ISO C++ forbids comparison between pointer and integer

Wenn ich statt char op; char op[1]; schreibe (ist ja maximal ein Zeichen lang) dann ist die Bedingung immer false.

JasonDX 8. Feb 2006 20:03

Re: [C++] Problem bei Stringverleich
 
In C unterscheidet sich ein Char von einem string auch in der schreibweise:
Code:
//String:
"Dies ist ein String"
//Char
'c'
Ein einfaches Hochkomma verwenden dürfte also helfen ;)

Zitat:

Zitat von 3_of_8
Wenn ich statt char op; char op[1]; schreibe (ist ja maximal ein Zeichen lang) dann ist die Bedingung immer false.

Das liegt daran, dass C hier konsistent ist und auch Strings 0-Indiziert, d.h. um ans erste element zu kommen: op[0] verwenden ;)

greetz
Mike


Edit:
Zitat:

Zitat von Chakotay1308
[edit]Och Mist... -.- Der blöde Info-1-Student aus München war schneller und richtiger als ich. :wall:[/edit]

Tja, entweder man hats, oder man hats nicht :mrgreen:

CalganX 8. Feb 2006 20:04

Re: [C++] Problem bei Stringverleich
 
Klammern.
Code:
if( (op=="+") || (op=="-") || (op=="*") || (op=="/") ) break;
Von Java weiß ich zwar, dass == stärker bindet als ||, allerdings weiß ich nicht, wie das bei C++ ist. Also würde ich mal davon ausgehen, dass C++ hier eine korrekte Klammerung erfordert.

Chris

[edit]Och Mist... -.- Der blöde Info-1-Student aus München war schneller und richtiger als ich. :wall:[/edit]

3_of_8 8. Feb 2006 20:12

Re: [C++] Problem bei Stringverleich
 
OK, hier mal mein ganzer Code, funzt nämlich immer noch nicht. Und == hat Vorrang vor ||.

Code:
#include <iostream.h>
#include <stdio.h>

int main(void){
 char op[1];
 int oprnd1, oprnd2, result;
 while(true){
  cout<<"Bitte geben sie einen arithmetischen Operator ein: ";
  cin>>op;
  if(op=='+'||op=='-'||op=='*'||op=='/') break;
  cout<<"Ungültiger Operator: "<<op<<"\n";
 }
 cout<<"Bitte geben sie den ersten Operanden ein: ";
 cin>>oprnd1;
 cout<<"Bitte geben sie den zweiten Operanden ein: ";
 cin>>oprnd2;
 if(op=="+") cout<<oprnd1<<"+"<<oprnd2<<"="<<oprnd1+oprnd2;
 if(op=="-") cout<<oprnd1<<"-"<<oprnd2<<"="<<oprnd1-oprnd2;
 if(op=="*") cout<<oprnd1<<"*"<<oprnd2<<"="<<oprnd1*oprnd2;
 if(op=="/") cout<<oprnd1<<"/"<<oprnd2<<"="<<oprnd1/oprnd2;
 getchar();
}

sniper_w 8. Feb 2006 20:16

Re: [C++] Problem bei Stringverleich
 
Code:
while(eingabe)
{
  cout<<"Bitte geben sie einen arithmetischen Operator ein: ";
  cin>>op;
  switch(op)
  {
  case '+':
  case '-':
  case '*':
  case '/':
  eingabe = false;
  break;

  default:
  cout<<"Ungültiger Operator: "<<op<< endl;
  break;

  }
}

HERMES 8. Feb 2006 20:16

Re: [C++] Problem bei Stringverleich
 
dann machs halt mit strcmp( OP, "+" )

3_of_8 8. Feb 2006 20:18

Re: [C++] Problem bei Stringverleich
 
Teste ich wann anderes mal, heute habe ich irgendwie keine Lust mehr...

Der Jan 8. Feb 2006 20:25

Re: [C++] Problem bei Stringverleich
 
char op; und nich char op[1];
zweites dekalriert einen Zeiger auf char also char*

3_of_8 8. Feb 2006 20:32

Re: [C++] Problem bei Stringverleich
 
Aha. Ich checke das zwar immer noch ned so ganz, aber egal.

Der Jan 8. Feb 2006 20:36

Re: [C++] Problem bei Stringverleich
 
Naja C/C++ ist zum Teil nich ganz easy, wenn man Delphi gewohnt ist :)

Also etwa so:

Code:
int main(void)
{
  char op;
  int oprnd1, oprnd2;
  while(true)
  {
    cout << "Bitte geben sie einen arithmetischen Operator ein: ";
    cin >> op;
    if(op == '+' || op == '-' || op== '*' || op == '/')
      break;
    cout << "Ungültiger Operator: " << op << "\n";
  }
  cout << "Bitte geben sie den ersten Operanden ein: ";
  cin >> oprnd1;
  cout << "Bitte geben sie den zweiten Operanden ein: ";
  cin >> oprnd2;
  switch(op)
  {
    case '+':
      cout << oprnd1 << "+" << oprnd2 << "=" << (oprnd1 + oprnd2);
      break;
    case '-':
      cout << oprnd1 << "-" << oprnd2 << "=" << (oprnd1 - oprnd2);
      break;
    case '*':
      cout << oprnd1 << "*" << oprnd2 << "=" << (oprnd1 * oprnd2);
      break;
    case '/':
      cout << oprnd1 << "/" << oprnd2 << "=" << (oprnd1 / oprnd2);
      break;
  }
  getchar();
}

Wobei noch zu erwähnen wäre, das du bei "/" wohl die Operanten nach double casten mußt, sonst gibts keine exakten Ergebnisse..

JasonDX 8. Feb 2006 20:36

Re: [C++] Problem bei Stringverleich
 
Zitat:

Zitat von 3_of_8
OK, hier mal mein ganzer Code
Code:
 char op[1];

Zitat:

Zitat von 3_of_8
Ich hab einen char op;

Da liegt der unterschied.
Mit op[1] legst du ein charArray an, also ist der Typ, den op am ende hat, char*, sowas wie ein normaler String, bei dir eben mit fixer Laenge 1. Du hast also nen Zeiger, und willst einen Zeiger mit einer Konstante vergleichen:
Code:
char* z;
if (z == "mops")...
Wobei: "mops" ist ein String, am Ende also auch nur ein Zeiger. Normalerweise kann man Zeiger auf vergleichen, kein Problem, aber anscheinend ist es bei Konstanten eben ein bisschen anders. Damit duerfte die Loesung, die HERMES dir gegeben hat, naemlich strcmp, einwandfrei funktionieren.

Ich bin mir nicht sicher, aber was auch klappen duerfte waere folgendes:
Code:
char op;
cin >> op;
op wird damit zu einem char degradiert und der vergleich kann ohne strcmp stattfinden.

und nochwas....
Zitat:

Zitat von 3_of_8
Code:
cin>>op;
//..
op=='+'||op=='-'||op=='*'||op=='/'
//...
if(op=="+") cout<<oprnd1<<"+"<<oprnd2<<"="<<oprnd1+oprnd2;

In C wird Code sehr schnell unübersichtlich, ich kann dir gern dafür ein Beispiel geben :mrgreen:
jedenfalls würde ich dir den Einsatz von leerzeichen empfehlen ;)

greetz
Mike

Box? *grml8

Der Jan 8. Feb 2006 20:43

Re: [C++] Problem bei Stringverleich
 
Zitat:

Zitat von JasonDX
Ich bin mir nicht sicher, aber was auch klappen duerfte waere folgendes:
Code:
char op;
cin >> &op;

Autsch. :twisted:
Warum "&" ? Warum refrenzieren?
"op" ist ein char, also ein int (!!) und somit mit dem istream-operator ">>" problemlos zu "füllen"

Edit: Ich seh grad im Original gibts kein "&" :gruebel: Hab aber echt auf Zitieren geklickt... Hmmmm. Dann betrachtet diesen Beitrag einfach als nicht geschrieben :) this = NULL (nochmal autsch...)

JasonDX 8. Feb 2006 20:46

Re: [C++] Problem bei Stringverleich
 
Zitat:

Zitat von Der Jan
Zitat:

Zitat von JasonDX
Ich bin mir nicht sicher, aber was auch klappen duerfte waere folgendes:
Code:
char op;
cin >> &op;

Autsch. :twisted:
Warum "&" ? Warum refrenzieren?
"op" ist ein char, also ein int (!!) und somit mit dem istream-operator ">>" problemlos zu "füllen"

Ich hab den ausrutscher vor 5 Minuten editiert :P
:zwinker:

greetz
Mike

Der Jan 8. Feb 2006 20:58

Re: [C++] Problem bei Stringverleich
 
Hmmm. :roll: Alte Leute verarschen :? Nich ernst nehmen... :drunken:

Zitat:

In C wird Code sehr schnell unübersichtlich
Es gibt nur zuwenig Durchblick :wink:
Code:
iBuf[i]=(char)(((c1-(c1<='9')?'0':('A'-10))<<4)+(c2-(c2<='0')?'9':('A'-10)));

JasonDX 8. Feb 2006 21:05

Re: [C++] Problem bei Stringverleich
 
Zitat:

Zitat von Der Jan
Hmmm. :roll: Alte Leute verarschen :? Nich ernst nehmen... :drunken:

Hey, jeder braucht ein Hobby :mrgreen:

Zitat:

Zitat von Der Jan
Zitat:

In C wird Code sehr schnell unübersichtlich
Es gibt nur zuwenig Durchblick :wink:
Code:
iBuf[i]=(char)(((c1-(c1<='9')?'0':('A' - 10))<<4)+(c2-(c2<='0')?'9':('A'-10)));

Gut, bedingte Zuweisungen sind ja ein ganz besonders fieses Ding (die mein Tutor dieses Semester kennengelernt hat :mrgreen: ), aber es stimmt schon, in C muss man sich bemühen, Code schön zu halten. Gerade deswegen ist Formatierung und Dokumentation besonders wichtig (Sprich: Leerzeichen, Zeilenumbrüche, und besonders Kommentare).

greetz
Mike


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz