Diğer cevaplara bakıldığında, C'deki yeni başlayanlar için, kodun sıkı boyutundan dolayı karmaşık görünebilirdi, bunu yeni başlayanlar için koyabileceğimi düşündüm, bunun yerine dizgeyi aslında ayrıştırmak daha kolay olabilir böyle ... şey strtok
kullanarak: Ben biraz daha kolay hale getirmek için kod modifiye
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
char **parseInput(const char *str, int *nLen);
void resizeptr(char ***, int nLen);
int main(int argc, char **argv){
int maxLen = 0;
int i = 0;
char **ptr = NULL;
char *str = "valgrind --leak-check=yes --track-origins=yes ./a.out";
ptr = parseInput(str, &maxLen);
if (!ptr) printf("Error!\n");
else{
for (i = 0; i < maxLen; i++) printf("%s\n", ptr[i]);
}
for (i = 0; i < maxLen; i++) free(ptr[i]);
free(ptr);
return 0;
}
char **parseInput(const char *str, int *Index){
char **pStr = NULL;
char *ptr = (char *)str;
int charPos = 0, indx = 0;
while (ptr++ && *ptr){
if (!isspace(*ptr) && *ptr) charPos++;
else{
resizeptr(&ptr, ++indx);
pStr[indx-1] = (char *)malloc(((charPos+1) * sizeof(char))+1);
if (!pStr[indx-1]) return NULL;
strncpy(pStr[indx-1], ptr - (charPos+1), charPos+1);
pStr[indx-1][charPos+1]='\0';
charPos = 0;
}
}
if (charPos > 0){
resizeptr(&pStr, ++indx);
pStr[indx-1] = (char *)malloc(((charPos+1) * sizeof(char))+1);
if (!pStr[indx-1]) return NULL;
strncpy(pStr[indx-1], ptr - (charPos+1), charPos+1);
pStr[indx-1][charPos+1]='\0';
}
*Index = indx;
return (char **)pStr;
}
void resizeptr(char ***ptr, int nLen){
if (*(ptr) == (char **)NULL){
*(ptr) = (char **)malloc(nLen * sizeof(char*));
if (!*(ptr)) perror("error!");
}else{
char **tmp = (char **)realloc(*(ptr),nLen);
if (!tmp) perror("error!");
*(ptr) = tmp;
}
}
. Kullandığım tek dize işlevi strncpy
idi.biraz uzun-sarılmış olduğundan emin olun, ancak sabit kodlanmış bir MAX_ARGS kullanmak yerine dizilerin dizisini dinamik olarak yeniden tahsis eder, yani çift işaretçinin sadece 3 ya da 4 olduğunda zaten bellek biriktirdiği anlamına gelir. bellek kullanımı verimli ve küçük, realloc
kullanarak, basit ayrıştırma işaretçisi kullanarak yinelemeye olarak, isspace
çalıştırılarak kaplıdır. Bir boşlukla karşılaşıldığında, çift işaretçi realloc
ve dize tutmak için malloc
ofset.
Üçlü işaretleyicilerin resizeptr
işlevinde nasıl kullanıldığına dikkat edin. Aslında, bunun basit bir C programı, işaretçiler, realloc, malloc, başvuru başına gönderme, ayrışmanın temel öğesi için mükemmel bir örnek olacağını düşündüm. dize ...
Bu yardımcı olur umarım, Saygılarımızla, Tom.
@Sneesh: Bu, C'deki eski atasözün 'Bir kediyi cildin birçok yolu var' diye benden nasıl yapabileceğinize dair mükemmel bir örnektir. – t0mm13b