www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wie nach 10. Semikolon String einlesen


Autor: DEV0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
wie kann man in C am schnellsten nach 10. Semikolon einen String 
einlesen. Man könnte z.B. 10-leere while Schleifen nehmen, ist nur 
redundant :-)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
strtoken / strtokencount

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char *tmp = "1;2;3;4;5;6;7;8;9;10,asf,adf,asdfasdf,";
int i = 0;
while ( i < 10 ) {
   if ( *tmp == ';' ) 
      ++i;
   ++tmp;
}

printf("%s", tmp );

so in etwas, man sollte aber noch dafür sorgen das nichts schief geht 
wenn es keine 10 ; gibt.

Autor: DEV0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab einen anwendungspezifischen compiler, der keine includes machen 
kann.

Autor: DEV0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pointer gehen auch nicht :-(

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DEV0 schrieb:
> Pointer gehen auch nicht :-(

Dann machs über Array-Zugriffe.
Das Prinzip ist doch dasselbe:
Den String Zeichen für Zeichen durchgehen und mitzählen wieviele ; man 
angetroffen hat. Aus der Schleife gehts raus, wenn der String zu Ende 
ist, oder eben wenn 10 Stück ; angetroffen wurden.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DEV0 schrieb:
> hab einen anwendungspezifischen compiler, der keine includes machen
> kann.

Dann nenn das Ding bitte nicht C-Compiler!

Den mit den Einschränkungen ist das alles mögliche, nur nicht C.

Autor: Xeraniad X. (xeraniad)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <iostream.h>

  /* g++ -Wno-deprecated -I/usr/include/c++/4.1.3/backward dlm.cpp -o dlm ; dlm ; rm dlm */

  void cut ( char const src [/*1 +cpc*/],   /* source      string */
             char       dst [/*1 +cpc*/],   /* destination " */
             char       dlm,                /* delimiter character */
             int        inx)                /* desired segment index */
  { int               s_i = 0,
                      d_i = 0;
    int               cnt = 0;
    while (('\0' != src [s_i]) && (inx > cnt)) {
      if (dlm == src [s_i])  ++ cnt;
      ++ s_i;
    }  /* while not at end of source string and more delimiters expected */
    while (('\0' != src [s_i]) && (dlm != src [s_i])) {
      dst [d_i] = src [s_i];  ++ d_i;
      ++ s_i;
    }  /* copy */
    dst [d_i] = '\0';  /* terminate */
    return;
  }  /* cut */

  #define CPC  31             /* capacity */
int main (int argc, char const *argv [])
{ char   const src [1 +CPC] = "0;1;2;3;4;5;6;7;8;9;10;11;";
  char         dst [1 +CPC] = "?";

  cut (src, dst, ';', 10);
  cout << "dst: \"" << dst << "\"." << endl;
  
  return 0;
}  /* main */

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abgesehen davon, daß dieser "Sourcecode" formatiert ist wie 'ne 
Klobürste, ist das C++. Womit der Threadstarter vermutlich noch viel 
weniger anfangen können wird.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Xeraniad X. schrieb:
> void cut ( char const src [/*1 +cpc*/]
> src [s_i]
das wird wohl schief gehen, weil man ja kein Zeiger übergibt, danach 
lieft man irgentetwas vom Stack aus.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich finde: die Aufgabenstellung ist so trivial, dass sie der 
Fragesteller alleine hinkriegen MUSS, wenn er sich auch nur in die Nähe 
des Begriffs "Programmierer" katapultieren will. Wenn er sich dann auch 
noch in die Nähe von "Softwareentwickler" schiessen will, dann muss er 
auch noch die richtige Idee dazu haben, zumal die nun wirklich nicht 
schwer zu finden ist.

Wie oft ein Zeichen in einem String vorkommt, ist Einsteigerniveau der 
6. oder 7. Unterrichtseinheit, gleich nachdem man erzählt bekommen hat, 
wie Strings in C funktionieren (aufbauend auf dem Begriff Array aus 2 
Stunden vorher).

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> das wird wohl schief gehen, weil man ja kein Zeiger übergibt, danach
> lieft man irgentetwas vom Stack aus.

sorry main fehler, das [] habe ich übersehen. Bei dieser Formatiertung 
auch kein wunder.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter schrieb:
> Xeraniad X. schrieb:
>> void cut ( char const src [/*1 +cpc*/]
>> src [s_i]
> das wird wohl schief gehen, weil man ja kein Zeiger übergibt, danach
> lieft man irgentetwas vom Stack aus.

Das ist schon in Ordnung.

Der Syntaktische Zucker

void foo( char a[] )
{
  ...
}

ist nichts anderes als der Versuch, den automatischen Pointer bei 
Array-Übergabe syntaktisch zu verstecken. Abgesehen davon passiert unter 
der Decke genau das gleiche wie bei

void foo( char * a )
{
  ...
}

Warum man diese Syntax in C erlaubt hat?
Keine Ahnung. Ausser das sich Neulinge etwas leichter tun, hat sie kaum 
Vorteile. Im Prototypen ist vielleicht etwas besser ersichtlich, dass 
die Funktion hier

void foo( char a[] );

ein bereits vorhandenes Array erwartet, während man bei

void foo( char * a );

nicht so recht weiß, wass es mit dem Pointer auf sich hat und sich erst 
mal schlau machen muss.

Autor: DEV0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Buchegger: kannst das mal konkretisieren?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll ich konkretisieren?

Meiner Meinung nach wurde schon alles gesagt und (leider) auch in einem 
Codebeispiel gezeigt.

Autor: Johann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DEV0 schrieb:
> @Buchegger: kannst das mal konkretisieren?

Oh Mann, lies doch erst einmal ein C-Buch!!

Autor: DEV0 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der code ist murx.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Er ist (für meinen Geschmack) schlecht formatiert. Aber Murx ist er 
nicht.

Im übrigen: Du hast die Lösungsidee, du hast deinen C-Compiler. Du hast 
sogar ein Musterbeispiel, welches diese Lösungsidee implementiert.
Was also hindert dich?

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DEV0 schrieb:
> der code ist murx.

Welcher? Hier stehen zwei Codebeispiele. Außerdem ist das nun wirklich 
keine große Aufgabe. Da du kein C benötigst, sondern anscheinend nur 
irgendeine einen Murx der eine Art beschnittenes C ist, sollte es dir 
möglich sein den Code von Peter entsprechend anzupassen. Danach musst du 
dir dann nur noch Gedanken machen wie du auf nicht vorhandene Semikolons 
reagierst.

Schleife -> 10. Semikolon suchen -> Bis Terminierung kopieren... so 
schwer ist das nicht.

Autor: Xeraniad X. (xeraniad)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch für Klobürsten gilt: form follows function ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.