Strings und Zeiger

mike85

Grünschnabel
Hallo versuche grade wieder in C einzusteigen und habe folgendes Problem.

Ich möchte einen String einlesen und die einzelnen Wörter einem temporären String übergeben. Jedoch versteh ich offensichtlich den Umgang mit Zeigern nicht richtig.

Folgender Code erzeugt die anschließende Ausgabe:

Code:
#include <stdio.h>
#include <stdlib.h>

int main(void) {

	char input[] = "Servus das hier soll ein Test sein X";
	char output[40];

	char mychar;

	char *temp_string;

	int i;
	int j = 0;
	int str_length;

	int start = 0;
	int ende = 0;
	int length = 0;

	for(i=0; i<strlen(input); i++)
	{
		printf("%02d ", i);
	}
	printf("\n");
	for(i=0; i<strlen(input); i++)
	{
		printf(" %c ", input[i]);
	}
	printf("\n\n");

while(input[ende] != 'X')
{

	while(input[ende] != ' ')
	{
		ende++;

	}

	length = ende-start;

	temp_string = malloc(length*sizeof(char));
	printf("Runde:%d\tLänge: %d\tStart: %02d\tEnde: %02d\tEinzel:", j, length, start, ende);

	for(i = start; i<ende; i++)
	{
		temp_string[i-start] = input[i];
		printf("%c", input[i]);
	}

	str_length = strlen(temp_string);

	printf("\tstrlen: %d\t", str_length);

	printf("String: %s\n", temp_string);

	free(temp_string);

	if(input[ende] != 'X')
	{
		start = ++ende;
	}

	j++;

}

	return EXIT_SUCCESS;
}

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
S e r v u s d a s h i e r s o l l e i n T e s t s e i n X

Runde:0 Länge: 6 Start: 00 Ende: 06 Einzel:Servus strlen: 6 String: Servus
Runde:1 Länge: 3 Start: 07 Ende: 10 Einzel:das strlen: 3 String: das
Runde:2 Länge: 4 Start: 11 Ende: 15 Einzel:hier strlen: 6 String: hierus
Runde:3 Länge: 4 Start: 16 Ende: 20 Einzel:soll strlen: 6 String: sollus
Runde:4 Länge: 3 Start: 21 Ende: 24 Einzel:ein strlen: 3 String: ein
Runde:5 Länge: 4 Start: 25 Ende: 29 Einzel:Test strlen: 6 String: Testus
Runde:6 Länge: 4 Start: 30 Ende: 34 Einzel:sein strlen: 6 String: seinus


Die Ausgaebe zeigt mir, dass die einzelnen Wörter grundsätzlich in richtiger Länge dem char-Zeiger übergeben werden. Allerdings scheint dieser bei der Ausgabe auf noch zuvor allokierten Speicher zuzugreifen.

Kann mir jemand erklären warum das so ist?

Vielen Dank schonmal, fürs lesen bis hierhin :)
 
Das Problem ist, dass dein temp_string nicht 0-terminiert ist und die Ausgabe daher nicht weiss, wann sie aufhören muss.

Code:
temp_string = malloc(length + 1); // sizeof(char) repräsentiert immer 1 auf deiner Maschine
temp_string[length] = 0;
...
 
Verstanden hab ich das noch nicht ganz.. werd aber mal weiterforschen.

DANKE jedenfalls für die schnelle und funktionierende Lösung, hat mein Problem gelöst.....

lg
 
Versetz dich mal in die Lage des Computers:
Du bekommst eine Adresse an der ein String steht, den du ausgeben sollst. Konkret zeigt diese Adresse einfach auf den ersten Buchstaben des Strings. Du kannst jetzt also mal anfangen auszugeben. Du kommst jedoch sehr schnell an ein Problem: Wann aufhören? Du hast ja das Ende nicht bekommen! Als Konvention hat man beschlossen das Zeichen mit dem ASCII-Wert 0 als Ende zu bezeichnen. Der Computer gibt also so lange ein weiteres Zeichen aus, bis er zu einem kommt, das den Wert 0 hat. temp_string hat in deinem Fall nie ein Zeichen, das den Wert 0 hat, du weist ihm ja nur einzelne Buchstaben aus dem originalen String zu. Daher weiss der Computer nicht, wie lange er ausgeben muss (bzw. er macht einfach so lange weiter, bis ein Zeichen mit dem Wert 0 kommt). Was nach temp_string kommt ist purer Zufall.
 
Verstanden hab ich das noch nicht ganz.. werd aber mal weiterforschen.
Das hat nicht viel mit Verstehen zu tun, sondern das ist eine Festlegung, das Zeichenketten in C am Ende ein Null-Zeichen haben müssen. Sonst wissen die Zeichenkettenfunktionen (z.B. strlen) nicht, wie lang der Speicherbereich ist, der die Zeichenkette beinhaltet. Es wird nämlich nur ein Zeiger übergeben, der die Adresse es ersten Zeichens enthält. Sonst ist weiter keine Information über die Anzahl der Zeichen verfügbar.

Gruß
MCoder
 
Alles klar.. mann hab das mit dem "temp_string[length] = 0" falsch verstanden.. einfach String-Ende klar machen :)

Thx nochma und alles jute soweit


lg
 
Zurück