Zahlen in Batch auseinander schreiben
Hallo zusammen,
ich habe folgendes in Batch geschrieben:
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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 279427
Url: https://administrator.de/contentid/279427
Ausgedruckt am: 08.11.2024 um 15:11 Uhr
6 Kommentare
Neuester Kommentar
Das ist etwas off topic in "Batch & Shell", aber mit ein paar Zusatzinformationen sicher.
Grüße
rubberman
EDIT:
OK, versuche Folgendes:
Der Aufruf wäre dann bspw.
EDIT 2:
Code kommentiert.
- Haben die beiden Strings immer eine konstante Länge?
- 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;
}
programmname Admin 1234
EDIT 2:
Code kommentiert.
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.
Grüße
rubberman
#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;
}
rubberman