[noch nicht ganz solved] strcmp in c

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
kniepbert
Beiträge: 16
Registriert: 02.07.2008 21:29:10

[noch nicht ganz solved] strcmp in c

Beitrag von kniepbert » 05.06.2010 13:23:30

Hallo *,

ich versuche mich ein wenig in C und habe mich momentan total verwirrt. :)
Ich möchte eine Zeichenkette solange durchlatschen bis ich ein Terminalzeichen gefunden habe.
Dazu muss ich nach selbigem Suchen und da trete ich schon seit geraumer Zeit auf der Stelle.
So funktioniert es nicht, da strcmp anscheinend pointer und keine Chars verlangt:

Code: Alles auswählen

int i = 0;
        char payload[] = "Irgendein Text mit Ende-Zeichen#";
        char acc = payload[i];
        while ( strcmp(acc,'#')==0) {
                printf("%c",acc);
                i++;
                acc = payload[i];
                }
Habe jetzt schon diverse Herumdoktoreien gemacht und würde gern einen netten Tipp abgrasen; bin etwas durcheinander gerade.

Vielen Dank
Christian
Zuletzt geändert von kniepbert am 06.06.2010 09:37:36, insgesamt 2-mal geändert.

Benutzeravatar
bmario
Beiträge: 1257
Registriert: 05.09.2007 12:15:47
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dresden

Re: strcmp in c

Beitrag von bmario » 05.06.2010 14:35:32

warum nicht:

Code: Alles auswählen

int i;

for(i=0; i<strlen(payload); i++) {
    if(payload[i] == '#') {
         //tue etwas
    }
}
*edit: wenn wirklich strcmp, dann geht auf alle Fälle:

Code: Alles auswählen

char payload[] = "blablablub";
char compareWith[] = "blub";
strcmp(payload, compareWith); // ich glaube so geht es, da char * str analog ist zu char str[]
am besten wäre aber für das was du machen willst strstr()
Nichts zu tun ist viel besser,
als mit viel Mühe nichts zu schaffen. - Laotse

kniepbert
Beiträge: 16
Registriert: 02.07.2008 21:29:10

Re: strcmp in c

Beitrag von kniepbert » 05.06.2010 16:27:51

Hmm... OK, das klappt ja soweit..

Vlt. kurz was ich machen will.
Eine Funktion soll je nach (hier unwichtiger) Bedingung einen String übersenden.
Da der String in den verschiedenen Konsequenten verschieden lang ist und ich die Variable ausserhalb der if/then/else-Konstruktion initialisieren muss (lambda-kalkül und so) dachte ich mir, dass ich einfach ein viel zu grosses Char-Array initialisiere, in den Konsequenten befülle und später dann verkürze.
Um zu sehen, wann der Text zuende ist, terminiere ich den String mit #.

Irgendwie ist das jedoch durch die Brust ins Auge.

Benutzeravatar
bmario
Beiträge: 1257
Registriert: 05.09.2007 12:15:47
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dresden

Re: strcmp in c

Beitrag von bmario » 05.06.2010 19:02:21

Nunja, strings Variabler Länger sind in C so ne Sache. Aber in jedem Fall fände ich es sinnvoller, sofern du weißt wie lang in jedem Fall der String ist, Speicher zu allokieren, anstatt son statischen Hickhack.

etwa sohier:

Code: Alles auswählen

int n; //die Länge deine Strings sei n
char * textbuf = (char) malloc(sizeof(char) * (n+1)); // +1 wegen \0, dem Nullzeichen, welches deinen String terminiert
Bzw. nimm \0 als Terminierungszeichen, ist allemal besser als das # Dings ;)
Nichts zu tun ist viel besser,
als mit viel Mühe nichts zu schaffen. - Laotse

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: strcmp in c

Beitrag von gms » 05.06.2010 19:36:55

kniepbert hat geschrieben: So funktioniert es nicht, da strcmp anscheinend pointer und keine Chars verlangt:
'Chars' kannst du ja auch einfacher vergleichen;

Code: Alles auswählen

        while ( acc=='#') {
strcmp ist für C-Strings, daher Pointer auf 'char' Werte, die '\0' terminiert sind

Gruß
gms

kniepbert
Beiträge: 16
Registriert: 02.07.2008 21:29:10

Re: strcmp in c

Beitrag von kniepbert » 05.06.2010 20:44:14

HA! Voll geil!

Code: Alles auswählen

#include <stdio.h>
#include <string.h>

main()
{
    int i = 0;
    char payload[] = "Irgendein Text mit Ende-Zeichen#";
    char acc = payload[i];
    while ( acc!='#') {
            printf("%c",acc);
            i++;
            acc = payload[i];
            }
}
Funzt... Vielen Dank.

Schönes Restwochenende
Christian

kniepbert
Beiträge: 16
Registriert: 02.07.2008 21:29:10

Re: [solved] strcmp in c

Beitrag von kniepbert » 05.06.2010 21:03:17

na gut, einen hab ich noch, dann bin ich auch ruhig für heute... :)

Code: Alles auswählen

#include <stdio.h>
#include <string.h>
#include <sys/types.h>

main()
{
    int i = 0;
    char payload[] = "Irgendein Text mit sEnde-Zeichen#";
    char acc = payload[i];
    while ( acc!='#') {
        i++;
        acc = payload[i];
        }
    printf("Text hat %d Zeichen\n",i);   
    char msg[i];
    strncpy(msg,payload,i);
    int j;
    u_char acc2;
    for(j=0; j < i; j++){
      acc2 = msg[i];
      printf("%c",acc2);
    }
    printf("\n");
    return 0;
}
Ist noch nicht ganz funktional, ich hab das mit den Chars noch nicht richtig. Bekomme für jedes Zeichen ein Kreuz.

Code: Alles auswählen

Text hat 32 Zeichen
††††††††††††††††††††††††††††††††
Bin da wohl mit u_char und char durcheinander. hmm...
Ich habe versucht die Initialisierung von zwei Post zuvor zu nehmen, aber den Fall habe ich noch nicht ganz durchgeistigt.
Schon witzig wie abhängig man von Sprachen wie python werden kann, da muss man sich um nichts kümmern.. hehe

Grüße
Christian

storm
Beiträge: 1581
Registriert: 01.05.2004 13:21:26
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: DE

Re: [solved] strcmp in c

Beitrag von storm » 06.06.2010 10:44:56

Code: Alles auswählen

...
    for(j=0; j < i; j++){
      acc2 = msg[i];       // *hust* index?
      printf("%c",acc2);
    }
Du solltest dich auf jeden Fall mal mit gdb anfreunden und bei solchen 'undurchsichtigen' Sachen im Einzelschritt durchgehen.

ciao, storm
drivers/ata/libata-core.c: /* devices which puke on READ_NATIVE_MAX */

Benutzeravatar
Meillo
Moderator
Beiträge: 9252
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [solved] strcmp in c

Beitrag von Meillo » 06.06.2010 18:07:24

Das Problem löst sich ja durch storms Beitrag. Ich habe noch weitere Anmerkungen.

Code: Alles auswählen

main()
Hast du mit -Wall kompiliert? Hier fehlt nämlich was.

Code: Alles auswählen

    while ( acc!='#') {
        i++;
        acc = payload[i];
        }
Inkonsistenter Einrückungsstil. Das solltest du unbedingt vermeiden.

Code: Alles auswählen

    char msg[i];
    strncpy(msg,payload,i);
Off-by-one? Oder wirklich so gewollt? Egal ob so oder so, du solltest aber wissen was ich meine und begründen können weshalb du es so hast wie du es hast.

Code: Alles auswählen

    u_char acc2;
Weshalb u_char?

Code: Alles auswählen

    for(j=0; j < i; j++){
      acc2 = msg[i];
      printf("%c",acc2);
    }
Vergleiche die Formatierung des Codes hier mit der while-Schleife oben.
Use ed once in a while!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: [solved] strcmp in c

Beitrag von gms » 06.06.2010 19:37:22

Code: Alles auswählen

    u_char acc2;
'u_char' wird in keinem C Standard definiert, wenn du dein Programm nicht von einer GNU-Extension abhängig machen möchtest, solltest du lieber 'unsigned char' oder einen selbst definierten Datentyp verwenden

dann mal abgesehen von dem
storm hat geschrieben:*hust* index?
, also wenn ich das mal umschreibe:

Code: Alles auswählen

...
    u_char acc2;
    for(j=0; j < i; j++){
      acc2 = msg[j];    
      printf("%c",acc2);
    }
    printf("\n");
    return 0;
}
dann, kannst du das auch kürzer haben:

Code: Alles auswählen

   printf("%.*s\n",i,msg);
    return 0;
}
oder, wenn du bei der for-Schleife bleiben möchtest, dann gehts auch so:

Code: Alles auswählen

...
    for(j=0; j < i; j++)
      printf("%c",msg[j]);
    printf("\n");
    return 0;
}
denn der printf Implementierung ist es völlig egal, ob du 'signed char' oder 'unsigned char' übergibst

Gruß
gms

Benutzeravatar
Meillo
Moderator
Beiträge: 9252
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: [solved] strcmp in c

Beitrag von Meillo » 06.06.2010 20:13:25

gms hat geschrieben: denn der printf Implementierung ist es völlig egal, ob du 'signed char' oder 'unsigned char' übergibst
Weil mich interessierte wie genau das ist habe ich gerade in den ISO C99-Standard geschaut. Zum ``convertion identifier'' c steht:
If no l length modifier is present, the int argument is converted to an unsigned char, and the resulting character is written.
(Wenn ein ``l length modifier'' (also %lc) angegeben wird geht es um wchar, wenn ich das richtig verstanden habe.)

D.h. erwartet wird (bei %c) immer ein int, der auf unsigned char gecastet wird.

So steht's auch im K&R.
Use ed once in a while!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: [solved] strcmp in c

Beitrag von gms » 06.06.2010 21:04:29

Meillo hat geschrieben:Wenn ein ``l length modifier'' (also %lc) angegeben wird geht es um wchar, wenn ich das richtig verstanden habe.
stimmt genau
Meillo hat geschrieben: D.h. erwartet wird (bei %c) immer ein int, der auf unsigned char gecastet wird.
ja, und diese 'Herumcasterei' ( inklusive dem Ignorieren von arithmentischen Überläufen ) bewirkt, daß das Ergebnis immer gleich ist, egal ob 'signed char' oder 'unsigned char' übergeben wurde:

Code: Alles auswählen

gms@sirius ~ $ cat x.c
#include <stdio.h>
#include <limits.h>

int main() {
  int n;
  char sc;
  unsigned char uc;
  unsigned char rc;

  printf("%d\n", rc = n = sc= 0 );
  printf("%d\n", rc = n = uc= sc );
  printf("%d\n", rc = n = sc= CHAR_MAX );
  printf("%d\n", rc = n = uc= sc );
  printf("%d\n", rc = n = sc= CHAR_MIN );
  printf("%d\n", rc = n = uc= sc );
  printf("%d\n", rc = n = sc= -1 );
  printf("%d\n", rc = n = uc= sc );
  return 0;
}

gms@sirius ~ $ gcc -o x x.c -Wall && ./x
0
0
127
127
128
128
255
255
gms@sirius ~ $
( edit: habe jetzt noch '-1' hinzugefügt und umsortiert )

Gruß
gms

Antworten