2016-08-26 5 views
-1

Ich habe eine Frage, ich kenne die folgende Implementierung korrekt funktioniert:C Programmieren, Ändern Zeichenfolge in Funktion, ohne die Größe als Parameter übergeben

void editMessage(char* message , int sizeOfMessage){ 
    char newMessage[] = "modified"; 

    printf("size of message is %lu \n",sizeof(message)); 
    printf("size of new message is %lu \n",sizeof(newMessage)); 

    if (sizeof(newMessage) <= sizeOfMessage) { 

     for (int i=0 ; i < sizeof(newMessage); i++) { 

      message[i] = newMessage[i]; 

     } 

    } else { 
     printf("size of new message is too big\n"); 
    } 

} 

int main() { 

    char randMessage[] = "original message"; 
    editMessage(randMessage,sizeof(randMessage)); 
    printf("the value of randMessage after function call is %s \n",randMessage); 
    return 0; 
} 

aber wenn ich will den String-Wert in der Funktion ohne Übergang ändern die Größe des Zeigers, ist es möglich? wenn ja, wie? wenn nicht, warum nicht?

Ich meine, ich bin auf der Suche über editMessage Funktion, so etwas zu ändern:

void editMessage(char* message){ 
    char newMessage[] = "modified"; 

    printf("size of message is %lu \n",sizeof(message)); 
    printf("size of new message is %lu \n",sizeof(newMessage)); 

    if (sizeof(newMessage) <= sizeOf(message)) { 

     for (int i=0 ; i < sizeOf(message); i++) { 

      message[i] = newMessage[i]; 

     } 

    } else { 
     printf("size of new message is too big\n"); 
    } 

} 

und den Anruf in der Haupt wie diese

editMessage(randMessage); 

, warum dies nicht funktioniert, könnte man bitte erklären, im Detail, und dann würde ich seine Antwort akzeptieren? Danke!

+5

'sizeof (Nachricht)' ist die * Größe des Zeigers *, nicht die Größe des Objekts verweist er auf. – EOF

+1

Verwenden Sie 'strlen', um die * Länge * eines Strings zu erhalten. –

+1

@ user3001566 Zumindest die erste Funktion, die Sie gezeigt haben, ist falsch und ergibt keinen Sinn :) –

Antwort

3

sizeOf(message) wird nicht funktionieren. sizeOf(message) gibt die Größe der Variablen message, und da ursprünglich message ein Zeiger ist, erhalten Sie die Größe eines Zeigers.


Da es ein NUL terminierten String ist, können Sie die Länge der Zeichenfolge erhalten, indem strlen() mit und verwenden, die in Ihrer Funktion.


Also, Ihr Code wie folgt aussehen sollte,

void editMessage(char* message){ 
    char newMessage[] = "modified"; 
    int size = strlen(message); 

    printf("size of message is %d \n", size); 
    printf("size of new message is %lu \n",sizeof(newMessage)); 

    if (sizeof(newMessage) <= size) { 

     for (int i=0 ; i < size; i++) { 

      message[i] = newMessage[i]; 

     } 

    } else { 
     printf("size of new message is too big\n"); 
    } 

} 

Für eine Reihe von char, die nicht durch NUL beendet wird, gibt es keine Möglichkeit, andere die Länge, um herauszufinden, dann Senden der Länge des Arrays von char als Parameter.

Daher müssen Sie in der aufrufenden Funktion die Nummer von char s verfolgen, die Sie in das Array schreiben (um die Länge zu wissen).

Hinweis Ich sage nicht, String weil eine Reihe von char eine Zeichenfolge wird nur, wenn es von einem NUL Zeichen beendet.


HINWEIS:

Verwenden Sie die Standard-Definition von main()

int main(void) //if no command line arguments. 
+0

Was ist, wenn das Zeichenfeld nicht durch null terminiert wird? Dann, wenn ich Strlen nicht verwenden kann, was ist die Lösung? Wenn du diesen Zustand erklären könntest und ihn zu deiner Antwort hinzufügst, würde ich deinen Beitrag als Antwort auf diesen Thread akzeptieren, Danke – Jack

+0

@ user3001566, da gehst du .. :) – Haris

+0

Vielen Dank! – Jack

1

In C

void func(char message[]) wird void func(char *message). Wenn Sie also eine sizeof(message) in der aufgerufenen Funktion ausführen, wird nur die Größe des Zeigers zurückgegeben. In "C" werden Arrays nicht durch Werte übergeben.

Wenn Sie sicher sind, wird Ihr Zeichen-Array immer null-terminiert, Sie verwenden strlen, um seine Länge zu erhalten.

+0

Was ist, wenn das Zeichenfeld nicht durch null terminiert wird? Dann, wenn ich Strlen nicht verwenden kann, was ist die Lösung? Vielen Dank – Jack

0

Verwenden Sie strlen, um die Länge der Eingabezeichenfolge abzurufen.

BTW: Beachten Sie, diesen Teil des Codes:

if (sizeof(newMessage) <= sizeOfMessage) { 

    for (int i=0 ; i < sizeOfMessage; i++) { 

     message[i] = newMessage[i]; 

Wenn sizeof(newMessage) 9 und sizeOfMessage 100 Sie newMessage[9] zu newMessage[99], die außerhalb des Arrays zugreifen.

2

Wenn ich den String-Wert in Funktion ändern möchte, ohne die Größe des Zeigers zu übergeben, ist es möglich? wenn ja, wie? wenn nicht, warum nicht?

Sie können die Länge der Eingangsnachricht über die Funktion strlen() bestimmen. Angenommen, Sie legen fest, dass die Funktion nur für ordnungsgemäß nullterminierte Strings funktioniert, ist es sinnvoll anzunehmen, dass das Array, das die Zeichenfolge enthält, lang genug ist, um es aufzunehmen, einschließlich des Terminators. So könnte man in gewissem Umfang strlen(message) + 1 anstelle der ursprünglichen sizeOfMessage.

jedoch, das ist mehr als die Begrenzungs ursprüngliche Funktion, da das Array der Zeichenfolge enthält, größer sein könnte als der String erfordert. Wenn Sie die Länge der Eingabezeichenfolge verwenden, um die Länge der Ersatzzeichenfolge zu begrenzen, können Sie diese überschüssige Kapazität niemals nutzen. Bedenken Sie:

int main() { 
    char randMessage[1024] = ""; 
    /* 
     * sizeof(randMessage) is 1024, but strlen(randMessage) is 0. Which do 
     * you prefer as the limit on the size of the message that editMessage() 
     * can insert? 
     */ 
    editMessage(randMessage, sizeof(randMessage)); 
    return 0; 
} 
Verwandte Themen