2012-03-26 4 views
1

Ich versuche, eine Funktion zu schreiben Strings in C ändern Wenn ich eine Funktion wiePointers und Streicher in C

char *func(char *s){ 
    char *t=s; 
    s++;  //option 1 
    t++;  //option 2 
    *t='a'; //option 2 
    return s; 
} 

haben, wenn ich so etwas tun [Option 1]: s++; ich es glauben wird den Zeiger dorthin zurückbringen, wo s gerade zeigt. Wenn ich [Option 2]: t++; und *t='a'; dann return s, gebe es die Adresse für die erste Stelle von s, aber mit geänderten Inhalten oder gibt es die Adresse mit dem ursprünglichen Inhalt zurück?

+7

Lesen Sie ein Buch. Es gibt viele Bücher darüber, wie C funktioniert. –

+0

Ihre Funktion gibt momentan nichts zurück, daher ist Ihre Frage unklar. –

+0

Bücher. Das ursprüngliche Internet. –

Antwort

2

Wenn ich t ++; und * t = 'a'; dann s zurücksenden, wird es die Adresse für die erste Stelle von s zurückgeben, aber mit geänderten Inhalten oder gibt es die Adresse mit dem ursprünglichen Inhalt zurück?

Ich glaube, Ihre Frage so etwas wie dies setzt voraus:

char s[] = "abcde"; 
char *t = s; 
t++; 
*t = 'a'; 

Hier haben Sie einen String und zwei Zeiger, dass zunächst beide auf den Anfang des Strings bekommen. In der dritten Zeile ändern Sie einen der Zeiger, um auf das nächste Zeichen zu zeigen. In der vierten Zeile ändern Sie die Daten an diesem Ort. Da s auf dieselben Daten zeigt und die Daten geändert werden, ändert sich die Zeichenfolge, auf die s zeigt.

printf("s is: %s\n", s"); // s is: aacde 
printf("t is: %s\n", t"); // t is: acde 

BTW, gibt es keinen besseren Weg, um wirklich das Zeug zu lernen als kleine Testprogramme zu schreiben und mit ihnen spielen. Ein gutes Buch wird erklären, wie die Dinge funktionieren sollen, aber das Spielen mit Code ist die Art, wie Sie wachsen, um den Code wirklich zu verstehen und zu glauben, was die Bücher Ihnen sagen.

+1

brauchst du 'char s [] =" abcde "' um es ändern zu können? – steabert

+0

@steabert Ja, das hast du bestimmt. Danke, dass du das verstanden hast. – Caleb

4
char *func(char *s) 

In diesem Code s ist ein Zeiger auf einen Bereich des Speichers, daß (I annehmen) eine Zeichenfolge darstellt.

s++; 

jetzt s Punkte auf die nächsten Zeichen im gleichen Bereich des Speichers, dass (ich nehme an) einen String.

char *t=s; 

Jetzt haben Sie zwei Zeiger auf den Bereich des Speichers.

t++; 
*t='a'; 

Jetzt haben Sie diesen Bereich des Speichers verändert, mit einem 'a' das zweite Zeichen zu ersetzen.

Daher: wenn Sie dann s zurückgeben, werden Sie einen Zeiger auf denselben Bereich des Speichers zurückgeben, der geändert wurde. Wenn Sie eine geänderte Kopie der Zeichenfolge zurückgeben möchten, müssen Sie zunächst eine Kopie des Speichers erstellen.

char *func(char *s){ 
    char *t=strdup(s); //duplicates a string 
    s++; 
    *t='a'; 
    free(t); //you have to free the memory from strdup at some point 
    return s; //returns pointer to second character of unchanged string 
} 
+0

Aa Sie haben den Zeiger 't' erhöht, das' freie' Bit ist undefiniert. –

+0

@EdHeal: Danke, ich hatte auch einen falschen Kommentar. –

0

Im Code:

char *func(char *s) 
{ 
    char *t=s; 
} 

Sie eine return-Anweisung fehlt, ist so Müll zurück.

Die Variable s ist eine lokale Kopie von dem, was Sie an die Funktion übergeben haben. Wenn Sie innerhalb der Funktion s++ schreiben, ändern Sie, worauf der lokale Zeiger zeigt, aber ändern Sie das Argument nicht.

Wenn Sie das tun t++; und *t = 'a';, machen Sie t Punkt zum zweiten Zeichen der Zeichenfolge als s vergangen, und dann das Zeichen 'a' dem zuweisen.

Also, wenn Sie:

char *func(char *s) 
{ 
    char *t = s; 
    s++; 
    t++; 
    *t = 'a'; 
    return s; 
} 

dann wird der Rückgabewert ein Zeiger auf das zweite Zeichen der ursprünglichen Zeichenfolge sein, die enthalten 'a' modifiziert wurde.

+0

Ich dachte, dass Sie einen Doppelzeiger benötigen, um auf einen Zeiger zu zeigen. wäre das nicht das gleiche wie int a = b zu sagen, und wenn ich a ändere, wird b geändert? – chikuba

+1

@chikuba: Ich bin nicht ganz sicher, was Sie fragen. Ja, Sie benötigen einen Doppelzeiger, um auf einen Zeiger zu zeigen. Aber 's' in der Argumentliste ist einfach eine Kopie eines Zeigers, kein Zeiger auf einen Zeiger. Ähnlich ist "t" ein einfacher Zeiger. Aber "* t" weist einen Teil des Strings zu, auf den "s" zeigt. Das Schreiben von '* t = 'a';' ändert die Zeichenkette, aber nicht den Zeiger auf die Zeichenkette. Insbesondere, wenn der Aufruf 'func (& array [4])' ist, ändert die '* t' Zuweisung 'array [5]' in der aufrufenden Funktion, ohne das '& array [4]' zu ändern (was genau so ist gut, da das nicht änderbar ist). –

+0

ja ofc. weiß nicht, was ich sage * noch etwas Kaffee zu haben * – chikuba

0

Welches Verhalten benötigen Sie?

Sowohl die Rückgabe des Anfangswerts von s als auch die Rückgabe des Endwerts von s sind sinnvoll.

Die eine Option, die Sie nicht haben, ist *t='a', aber mit dem ursprünglichen Speicher unverändert zurückzukehren. Speicher wird geändert

Die Rückkehr der ursprünglichen s ist ziemlich üblich, zum Beispiel strcpy.

Es ist auch üblich, einen Zeiger auf 'das nächste Zeichen nach dem, das ich gerade geändert habe' zurückzugeben (was eine Option ist, die Sie nicht angeboten haben).

Sie müssen durchdenken, und entscheiden, was ist hilfreich für die Funktion zu tun?