/ / Problemy z funkcją strtok () - c, tablice, token, strtok, execv

Problemy z komendą strtok () - c, tablice, token, strtok, execv

Próbuję podzielić ciąg na „tmp” iumieść go w tablicy wskaźników „arr”. Robię to, ponieważ zamierzam użyć „execv” na „arr”, ale nie mogę tego zrobić, ponieważ „arr” na końcu nie ma wartości NULL. Zamiast tego ma „(zerowy)”, a kiedy drukuję jego zawartość, pojawia się błąd segmentacji. Jak ustawić poprawnie „arr”, aby można go było używać z execv? Dzięki

#include<stdio.h>
#include<sys/wait.h>
#include<stdlib.h>
#include<string.h>

int main(){

char tmp[40] = "echo Hello World n ";
char *arr[40];

char *token = strtok(tmp, " n");
int index = 0;

while(token != NULL){
arr[index] = malloc(strlen(token) + 1);
arr[index] = token;

index = index + 1;
token = strtok(NULL, " n");
}


for(int i = 0; i < 40; i++){
printf("%s n", arr[i], arr[i]);
}


return 0;

}

Odpowiedzi:

2 dla odpowiedzi № 1

Oto duży problem:

arr[index] = malloc(strlen(token) + 1);
arr[index] = token;

Nie kopiujesz łańcucha, zamiast tego nadpisujesz wskaźnik. Powinieneś użyć strcpy aby skopiować ciąg:

strcpy(arr[index], token);

W takim przypadku może nie być konieczne kopiowanie ciągów, wystarczy przypisanie. Oznacza to również, że przydział nie jest potrzebny.


Istnieje również inny problem z twoim kodem: Pętla, w której drukujesz ciągi arr.

Przy takim ciągu powinieneś mieć tylko trzy elementy ważne w arr, reszta zostanie niezainicjowana i nieokreślony. Dereferencje (tak jak robisz to przy próbie wydrukowania „ciągów”, na które wskazują) doprowadzą do niezdefiniowane zachowanie.

Po poprzedniej pętli, gdzie inicjujesz arr, następnie index będzie liczbą prawidłowych elementów w arr. Użyj tego jako końca pętli drukowania:

for(int i = 0; i < index; i++){ ... }