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


von DEV0 (Gast)


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 :-)

von Peter (Gast)


Lesenswert?

strtoken / strtokencount

von Peter (Gast)


Lesenswert?

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

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

von DEV0 (Gast)


Lesenswert?

hab einen anwendungspezifischen compiler, der keine includes machen 
kann.

von DEV0 (Gast)


Lesenswert?

Pointer gehen auch nicht :-(

von Karl H. (kbuchegg)


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.

von Karl H. (kbuchegg)


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.

von Xeraniad X. (xeraniad)


Lesenswert?

1
#include <iostream.h>
2
3
  /* g++ -Wno-deprecated -I/usr/include/c++/4.1.3/backward dlm.cpp -o dlm ; dlm ; rm dlm */
4
5
  void cut ( char const src [/*1 +cpc*/],   /* source      string */
6
             char       dst [/*1 +cpc*/],   /* destination " */
7
             char       dlm,                /* delimiter character */
8
             int        inx)                /* desired segment index */
9
  { int               s_i = 0,
10
                      d_i = 0;
11
    int               cnt = 0;
12
    while (('\0' != src [s_i]) && (inx > cnt)) {
13
      if (dlm == src [s_i])  ++ cnt;
14
      ++ s_i;
15
    }  /* while not at end of source string and more delimiters expected */
16
    while (('\0' != src [s_i]) && (dlm != src [s_i])) {
17
      dst [d_i] = src [s_i];  ++ d_i;
18
      ++ s_i;
19
    }  /* copy */
20
    dst [d_i] = '\0';  /* terminate */
21
    return;
22
  }  /* cut */
23
24
  #define CPC  31             /* capacity */
25
int main (int argc, char const *argv [])
26
{ char   const src [1 +CPC] = "0;1;2;3;4;5;6;7;8;9;10;11;";
27
  char         dst [1 +CPC] = "?";
28
29
  cut (src, dst, ';', 10);
30
  cout << "dst: \"" << dst << "\"." << endl;
31
  
32
  return 0;
33
}  /* main */

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Peter (Gast)


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.

von Karl H. (kbuchegg)


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).

von Peter (Gast)


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.

von Karl H. (kbuchegg)


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.

von DEV0 (Gast)


Lesenswert?

@Buchegger: kannst das mal konkretisieren?

von Karl H. (kbuchegg)


Lesenswert?

Was soll ich konkretisieren?

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

von Johann (Gast)


Lesenswert?

DEV0 schrieb:
> @Buchegger: kannst das mal konkretisieren?

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

von DEV0 (Gast)


Lesenswert?

der code ist murx.

von Karl H. (kbuchegg)


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?

von Tobi (Gast)


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.

von Xeraniad X. (xeraniad)


Lesenswert?

Auch für Klobürsten gilt: form follows function ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.