Das Zeichen „#“ kann nicht als Befehlszeilenargument übergeben werden

Lesezeit: 3 Minuten

Benutzeravatar von cd-00
CD-00

Ich kann keine Zeichenfolgen beginnend mit übergeben # als Kommandozeilenargumente.

Hier ist ein einfacher Test:

#include <stdio.h>

int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; i++)
        printf("%s ", argv[i]);

    putchar('\n');

    return 0;
}

Wenn ich die Argumente wie folgt eingebe:

2 4 # 5 6

Der Wert von argc ist 3 und nicht 6. Es liest # und hält dort an. Ich weiß nicht warum, und ich kann die Antwort in meinen Kopien von nicht finden Die Programmiersprache C und C-Primer Plus.

  • Die Syntaxhervorhebung auf StackOverflow veranschaulicht Ihr Problem gut 🙂

    – Brad Allred

    13. November 2019 um 22:02 Uhr

Benutzeravatar von fanduin
Fanduin

# beginnt ein Kommentar in Unix-Shells, ähnlich wie // in C.

Das bedeutet, dass die Shell, wenn sie die Argumente an das Programm übergibt, alles nach dem # ignoriert. Wenn Sie ihn mit einem Backslash oder Anführungszeichen versehen, wird er wie die anderen Parameter behandelt und das Programm sollte wie erwartet funktionieren.

2 4 \# 5 6

oder

2 4 '#' 5 6

oder

2 4 "#" 5 6

Notiere dass der # ist ein Kommentarzeichen nur am Anfang eines Wortes, also sollte das auch funktionieren:

2 4#5 6

  • Das scheint eine ziemlich gute Liste zu sein unix.stackexchange.com/a/270979

    – Fanduin

    13. November 2019 um 13:35 Uhr

  • @cd-00 Sie müssen lernen, wie die Shell funktioniert. Das hat nichts mit deinem C-Code zu tun.

    – chepner

    13. November 2019 um 13:44 Uhr

  • Ah, Sie können also Kommentare eingeben interaktiv Shell-Sitzungen, sodass die Shell sie sofort ignorieren kann, nachdem Sie mit der Eingabe fertig sind. Was für eine nützliche Funktion.

    – Joker_vD

    13. November 2019 um 22:14 Uhr

  • @Joker_vD Während Sie sich eine Shell als Befehlszeilenschnittstelle vorstellen, ist sie eigentlich ein Skriptinterpreter. Die Tatsache, dass Sie es wie eine interaktive CLI verwenden können, ist ein netter Bonus. Warum sollte sich das Interpretierte beim “Ausführen eines Skripts” deutlich anders verhalten als beim interaktiven Eingeben von Befehlen? Wie wäre es mit echo echo Hello, World | bash. Ist das interaktiv? Oder vielleicht bash <<END?

    – Christoph Schultz

    13. November 2019 um 22:53 Uhr

  • @Joker_vD: Ich gebe häufig Kommentare in interaktiven Sitzungen ein, um darauf in meinem Shell-Verlauf zurückzugreifen. Manchmal dient dies dazu, einen Commit-Hash oder eine andere an stdout ausgegebene ID aufzuzeichnen; manchmal ist es eine Nachricht an mein zukünftiges Ich, dass ein Befehl fehlgeschlagen ist; manchmal dient es dazu, Timing-Daten für Ad-hoc-Benchmarking aufzuzeichnen. Es ist eine nützliche Funktion.

    – Waschen

    14. November 2019 um 5:07 Uhr

Wenn Sie den Wert über Befehlszeilenargumente übergeben, müssen Sie die folgenden Anweisungen befolgen. Die folgenden Zeichen haben in einigen Kontexten eine besondere Bedeutung für die Shell selbst und müssen möglicherweise in Argumenten maskiert werden:

` Backtick (U+0060 Grave Accent) ~ Tilde (U+007E) !  Ausrufezeichen (U+0021) # Raute (U+0023 Nummernzeichen) $ Dollarzeichen (U+0024) & Kaufmännisches Und (U+0026) * Sternchen (U+002A) ( Linke Klammer (U+0028) ) Rechte Klammer ( U+0029) (⇥) Tabulator (U+0009) { Linke geschweifte Klammer (U+007B Linke geschweifte Klammer)
[ Left square bracket (U+005B)
| Vertical bar (U+007C Vertical Line)
\ Backslash (U+005C Reverse Solidus)
; Semicolon (U+003B)
' Single quote / Apostrophe (U+0027)
" Double quote (U+0022)
↩ New line (U+000A)
< Less than (U+003C)
> Greater than (U+003E)
? Question mark (U+003F)
  Space (U+0020)1

  • How should they be escaped then?

    – ilkkachu

    Nov 14, 2019 at 8:26

  • \ – Escaped by using backslash .EX: 2 4 \{#,$,&,*} 5 6

    – VJAYSLN

    Nov 14, 2019 at 9:44


S.S. Anne's user avatar
S.S. Anne

It’s because you’re using an sh-like shell. Quote the # or escape it using \ and it will work.

This is called a comment in sh. It causes the # (space-hash) and any arguments after it to be discarded. It’s used similarly to comments in C, where it is used to document code.

Strings beginning with $ are called variables in sh. If you haven’t set a variable, it will expand to an empty string.

For example, all of these would be valid ways to pass the # to your application:

2 4 '#' 5 6
2 4 "#" 5 6
2 4 \# 5 6

And these would be valid ways to pass a string starting with $:

2 4 '$var' 5 6
2 4 '$'var 5 6
2 4 \$var 5 6

Please note that variables inside "s are still expanded.

1389520cookie-checkDas Zeichen „#“ kann nicht als Befehlszeilenargument übergeben werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy