Funktion mit char-array-parameter
Ich versuche zu schreiben, eine Funktion für das drucken von text in C für PIC-mikrocontroller (ich denke, es basiert auf gcc).
void print(char[] text);
void print(char[] text)
{
for(ch = 0; ch < sizeof(text); ch ++)
{
do_something_with_character(text[ch]);
}
}
- und nennen es wie folgt:
print("some text");
Ich bin immer compiler-Beschwerden über falsche Klammern.
-
Was ist Los mit diesem?
-
Wie kann ich ein char-array-Zeiger in diesem Fall?
- mögliche Duplikate von Wie benutze ich arrays in C++?
- eigentlich
char[] text
ist keine gültige C-syntax. Es solltechar text[]
oderchar *text
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde es so machen:
Die korrekte syntax ist
oder
In
print()
verwenden, können Siesizeof
Betreiber, um herauszufinden, die Länge der Zeichenkettetext
verwenden, benötigen Siestrlen()
(gehören<string.h>
ersten) oder testen, obtext[ch]
ist\0
.Wie bereits in anderen Antworten, deine syntax ist falsch. Die Klammern gehören nach
text
.Ebenfalls von besonderer Bedeutung,
sizeof
hat nicht tun, was Sie erwarten sind hier:Erinnern,
sizeof
ist ein compile-Zeit Betreiber - der compiler ersetzt Sie mit der Größe, während der code aufgebaut wird. Es kann nicht wissen, die Größe zur Laufzeit.In diesem Fall
sizeof(text)
ist immer wiedersizeof(void*)
oder 4 auf den meisten 32-bit-Systeme. Auf Ihrer Plattform können variieren.Haben Sie zwei Möglichkeiten:
char[]
als "C-string", wo die Länge ist unbekannt, aber die Zeichenkette NUL-Zeichen.Letzteres ist Ihre beste Wette, und Sie sollten wahrscheinlich ersetzen
char[]
mitchar*
.Hier verwenden wir einen NUL-terminierten string, und Durchlaufen Sie es mit einem Zeiger:
strlen
. Aber Achtung: Beim Umgang mit typischen C-strings, werden Sie selten um das, was die tatsächliche Länge der Zeichenfolge ist.Müssen Sie die eckigen Klammern in der richtigen Stelle:
oder verwenden Sie Zeiger notation:
Beachten Sie auch, dass, selbst wenn Sie die array-Schreibweise der parameter ist wirksam neu geschrieben, um einen Zeiger, und dann den code in den Körper der Funktion:
ist falsch. Sie fast sicher wollen nicht, die 4 oder 8 bytes, die die Größe des Zeigers. Sie wollen wahrscheinlich:
Wenn Sie sich nicht deklarieren Sie Variablen in der Schleife (C99 oder neuer erforderlich), deklarieren Sie Sie separat. Sie zeigen nicht die Erklärung der
ch
im code. Wenn es kompiliert, das bedeutet, dassch
ist eine Globale variable, die — und das ist ziemlich schrecklich.Beachten Sie, dass die
++
operator bindet sich fest und sollten nicht getrennt werden von Ihren Operanden durch ein Leerzeichen.Pass C-Stil-string-Pointern oder Klammern nach der variable name:
oder
Berechnen Sie die Länge einer Zeichenfolge, verwenden Sie
strlen
nichtsizeof
.strlen()
in der Schleifenbedingung konvertiert einen linearen Algorithmus in einen quadratischen Algorithmus als Länge ausgewertet wird, die bei jeder iteration es sei denn, der compiler ist wirklich schlau und kann feststellen, dass sich nichts ändert die Länge des Strings.string::length()
in der Schleife ist nicht schlecht.Beurteilung auf Ihre Frage und die Beobachtung, dass Sie wahrscheinlich ein Anfänger in C, werde ich versuchen, Ihre Frage zu beantworten, ohne Verwendung von Zeigern wie den anderen Antworten hier.
First off, Jonathon Reinhart macht einen ausgezeichneten Punkt, dass
sizeof
ist nicht die richtige Verwendung hier. Auch, wie andere darauf hingewiesen, dass der korrekte syntax für eine array von Zeichen, das ist, was Sie verwenden, in Ihrem code wie folgt:In deinem Fall würde ich etwas wie das hier tun:
Die standard library header
string.h
bietet diestrlen
Funktion gibt einen integer-Wert (eigentlich ein unsigned long) von der Länge der Zeichenfolge ohne des abschließenden NULL-Zeichens\0
. In C sind strings nur arrays von Zeichen, und die Art und Weise, die Sie angeben, das Ende der Zeichenkette ist durch die Einbeziehung\0
am Ende.