2013-09-19 4 views
-3

Я переписал свою предыдущую программу, и я хочу изменить * грязный на ** грязный. Не могли бы вы дать мне совет? Вот мой код:Как изменить указатель на указатель на указатель?

void clean(char *dirty) 
{ 
    int i = 0, j = 0; 
    char *temp; 

    temp = strdup(dirty); 

    if(NULL == temp) 
    { 
     printf("strdup(), failed"); 
     return; 
    } 

    while(i < strlen(temp)) 
    { 
     if(isalpha(temp[i]) || isspace(temp[i]) || temp[i] == '?' 
      || temp[i] == '.' || temp[i] == '!' || temp[i] == ',') 
     { 
      dirty[j] = temp[i]; 
      j++; 
     } 
     i++; 
    } 
    dirty[j] = '\0'; 
    free(temp); 
} 

часть измененного основные(), я имел некоторые проблемы и вместе с моим другом, мы создали это:

int main(int argc, char** argv) 
{ 
    FILE* fp; 
    char** tab; 
    int i = 0; 
    int lines = 0; 
    int length = 10; 

    if(argc != 2) 
    { 
     printf("Incorrent syntax! Use ./name_of_program input_file\n"); 
     return 1; 
    } 

    if(!(fp = fopen(argv[1],"r"))) 
    { 
     printf("Could not open the file! Please try again!\n"); 
     return 2; 
    } 

    tab = (char**)malloc(length*(sizeof(char*))); 
    if(!tab) 
    { 
     printf("Could not allocate memory!\n"); 
     free(tab); 
     return 3; 
    } 

    while(!feof(fp)) 
    { 
     tab[i] = getNumber(fp); 

     if(i >= length) 
      { 

       length += 10; 
       tab = (char**)realloc(tab, sizeof(char*)); 
       if(tab == NULL) 
       { 
        free(tab); 
        return 5; 
       } 
      } 

     if(tab[i] == NULL) 
     { 
      printf("Incorrect character in the infile! Terminating\n"); 
      free(tab); 
      return 4; 
     ... 
+0

Что вы хотите сделать с помощью 'char ** dirty', который вы не можете сделать с' char * dirty'? – jxh

+0

Я изменил main(), и теперь он требует ** грязного. Просто для практики. – all0star

+0

Что вы изменили в main.You просто изменение строки просто исключение номеров и некоторые другие символы в функции для этого вам просто нужен один указатель. если вам нужно сделать то же самое для группы строк за раз, вам нужен двойной указатель или массив указателей. – Gangadhar

ответ

0

В зависимости от того, что вы хотите сделать, пихты, отметить это в главном

tab = (char**)realloc(tab, sizeof(char*)); 

Так вы Перераспределение вашего массива 10 указателя на массив указателей размера 1. не делает (realloc изменяет выделенную память данного указателя на заданный размер, если вы поставляете больше, например length * sizeof ..., вы увеличите размер массива, вы просто не потеряете все данные.

Теперь, если вы хотите применить «чистую» функцию к массиву строк (char *), тогда вы ould включают текущий максимальный размер массива. Я бы предложил вам это быстрее.

void clean_All(char ** strings, int size) 
{ 
    int i; 

    if (strings == NULL) 
     return; 

    for(i = 0; i < size; i++) { 
     if (strings[i] == NULL) 
      return; 
     clean(strings[i]); 
    } 

    return; 
} 
+0

спасибо, я изменил свою программу, чтобы лучше понять явления указателя на указатель :) – all0star

0

Не совсем уверен, что вы имеете в виду. Что-то вроде этого?

void clean(char** dirtyPointer) 
{ 
    int i = 0, j = 0; 
    char* dirty = *dirtyPointer; 
    ... 
+0

Это было бы моим предложением. Странный вопрос. – JensG

Смежные вопросы