linuxa
Goto Top

Zahlen in Batch auseinander schreiben

Hallo zusammen,

ich habe folgendes in Batch geschrieben:

 
set /p OrderNo=Auftragsnummer: 

echo A%OrderNo:~1,1%d%OrderNo:~2,1%m%OrderNo:~3,1%i%OrderNo:~4,1%n

Das Ergebnis, wenn ich bspw. 1234 eingebe soll so aussehen: A1d2m3i4n

Es sieht aber so aus: A2d3m4in

Wieso? Kann mir da jemand weiterhelfen? Vielen Dank.

Content-Key: 279427

Url: https://administrator.de/contentid/279427

Ausgedruckt am: 28.03.2024 um 14:03 Uhr

Mitglied: rubberman
Lösung rubberman 06.08.2015 aktualisiert um 16:57:43 Uhr
Goto Top
Hallo Panubu,

starte mit
%OrderNo:~0,1%

Grüße
rubberman
Mitglied: Linuxa
Linuxa 06.08.2015 um 16:57:52 Uhr
Goto Top
Zitat von @rubberman:

Hallo Panubu,

starte mit
%OrderNo:~0,1%

Grüße
rubberman

Merci!! face-smile
Mitglied: Linuxa
Linuxa 07.08.2015 um 07:48:48 Uhr
Goto Top
Weiß jemand, wie ich das selbe vorhaben in C++ umsetze? Danke euch!
Mitglied: rubberman
rubberman 07.08.2015 aktualisiert um 16:57:17 Uhr
Goto Top
Das ist etwas off topic in "Batch & Shell", aber mit ein paar Zusatzinformationen sicher.
  1. Haben die beiden Strings immer eine konstante Länge?
  2. Sollen die beiden Strings als Argumente an dein Programm übergeben werden, oder ist einer oder sind beide Ausdrücke konstante Werte im Programm?

Grüße
rubberman

EDIT:
OK, versuche Folgendes:
#include <iostream>
#include <string>

int main(int argc, char *argv)
{
  if (argc != 3) // Wenn nicht 2 Argumente übergeben wurden ...
  {
    std::cerr << "Fehler!\n";  
    return 1; // Fehler und raus
  }

  std::string output = argv[1]; // Das erste Argument dem Ausgabestring zuweisen

  std::string::const_iterator it1 = output.begin(); // Iterator auf den Ausgabestring
  const char *it2 = argv[2]; // Iterator auf das zweite Argument

  // Solange der Iterator des Ausgabestrings nicht hinter dem Stringende liegt
  // und der Iterator des 2. Arguments nicht auf die Nullterminierung zeigt,
  // Schleifenrumpf ausführen und Iteratoren inkrementieren.
  for (; it1 != output.end() && (*it2); ++it1, ++it2)
    output.insert(++it1, *it2); // jeweiliges Zeichen des 2. Arguments an der inkrementierten Iteratorposition des Ausgabestrings einfügen

  if (*it2) // Wenn der Iterator des 2. Arguments nicht auf die Nullterminierung zeigt ...
    output += it2; // ... Reststring and den Ausgabestring anhängen.

  std::cout << output << '\n'; // Ausgabe  
  return 0;
}
Der Aufruf wäre dann bspw.
programmname Admin 1234

EDIT 2:
Code kommentiert.
Mitglied: rubberman
rubberman 08.08.2015 um 14:23:36 Uhr
Goto Top
Wird zwar ein Doppelpost, aber vielleicht sollte ich dir noch eine Alternative vorschlagen. Die Verwendung der string-Klasse erzeugt viel Overhead. Es finden Speicherallokationen statt, es gibt Kopiervorgänge und Speicherschubserei, die man dem Code nicht unbedingt ansieht. Die Argumente kommen nun mal als Pointer auf char rein und man kann ebenso gleich damit arbeiten. Das Ganze sieht dann zwar eher wie C aus, wäre aber "minimalinvasiv" und vermutlich auch etwas verständlicher.
#include <iostream>

int main(int argc, char *argv)
{
  if (argc != 3) // Wenn nicht 2 Argumente übergeben wurden ...
  {
    std::cerr << "Fehler!\n";  
    return 1; // Fehler und raus
  }

  const char *it1 = argv[1], *it2 = argv[2]; // Iteratoren auf das erste und zweite Argument
  while (*it1 && *it2) // Solange keine der beiden Iteratoren auf die Nullterminierung zeigt ...
    std::cout << *it1++ << *it2++; // ... jeweiliges Zeichen der Argumente ausgeben und Iteratoren inkrementieren

  std::cout << it1 << it2 << '\n'; // Ggf. Reststrings der Argumente ausgeben + Zeilenumbruch  
  return 0;
}
Grüße
rubberman
Mitglied: Linuxa
Linuxa 08.08.2015 um 17:26:48 Uhr
Goto Top
Hey,

vielen Dank. Werde das am Montag mal ausprobieren und mich melden. Danke dir!