2016-08-11 3 views
1

Так что я делаю несколько практических вопросов для выпускного экзамена. и у меня много проблем с динамической памятью.как поместить анализируемую строку внутри malloc/calloc/dynamic memory?

Так что вопрос хочет в основном разобрать через 2 разных источника и сравнить их, чтобы найти похожие слова. (один из файла csv и один из входа cgi)

поэтому я решил использовать malloc/calloc, чтобы поместить строку в каждый слот массива, а затем сравнить каждый слот. но у меня возникают некоторые проблемы с моим кодом:

char buffer[100],buffer2[100],tmp[100],line[100]; 
char *token,*tok,*input; 

int main() 
{ 
char s[100]="search=cat+or+dog+store"; 
char *search=(char*)calloc(10,sizeof(char)); 

strcpy(buffer,s); 
sscanf(buffer,"search=%s",buffer); 
int k=0; 
tok=strtok(buffer,"+"); 
    while(tok!=NULL) 
    { 
    strcpy(&search[k],tok); 
    k++; 
    tok=strtok(NULL,"+"); 
    } 
printf("%d\n",k); 
strcpy(&search[k],"\0"); 

***printf("%s",&search[0]); 
    printf("%s",&search[1]); 
    printf("%s",&search[2]); 
    printf("%s",&search[3]);*** 

char* csv=(char*)calloc(10,sizeof(char)); 
char tmp2[100]; 

FILE *fp; 
fp=fopen("web.csv","r"); 

    while(fgets(line,sizeof(line),fp)!=NULL) 
    { 
    strcpy(buffer2,line); 
    token=strtok(buffer2,","); 
     while(token!=NULL) 
     { 
     strcpy(csv,token); 
     csv++; 
     token=strtok(NULL,",");  
     } 
strcpy(csv,"\0"); 

free(csv); 
free(search); 
return(0); 
} 
  1. той частью я поставил между * я поставил, чтобы проверить, если строки были помещены внутри calloc. но ничего не распечатывается, или smt weird печатает. тот же код использовался для последней нижней части, и они оба либо пусты, либо только распечатывают странную фрагментированную часть кода.
  2. Когда я кладу бесплатный (csv) и свободный (поиск), он говорит, что «указатель, освобожденный, не был выделен». я искал его, но я не могу найти ответ на вопрос, почему он это делает?

спасибо!

+1

'sscanf (buffer," search =% s ", buffer);'? Um ... – WhozCraig

+0

его, чтобы избавиться от части строки «search =» переданной строки cgi, которая выглядит так: seach = dog + or + cat + store. Мне не нужна часть поиска – harekuin

+0

[Как создать массив строк в C?] (http://stackoverflow.com/questions/1088622/how-do-create-an-array-of-strings-in -c) –

ответ

2

Кажется, вы пытаетесь создать массив указателей.Итак, позвольте мне показать вам, что это выглядит как

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAXT 10 

int main(void) 
{ 
    char s[100]="search=cat+or+dog+store"; 
    char buffer[100]; 
    char **search = calloc(MAXT, sizeof(char *)); 
    if (sscanf(s, "search=%s", buffer) != 1) 
     return 1; 
    int t = 0; 
    char *token = strtok(buffer, "+"); 
    while (token != NULL && t < MAXT) 
    { 
     search[t++] = token; 
     token = strtok(NULL, "+"); 
    } 
    for (int i = 0; i < t; i++) 
     printf("%s\n", search[i]); 
    free(search); 
} 

Что искать

  • search объявлен как char ** означает указатель на указатель полукокса, который может быть использован как массив символьных указателей
  • в calloc, выделение для 10 элементов типа char *, то есть массив из 10 указателей
  • в sscanf, входные и выходные строки не должны быть s ame string. Я изменил аргументы, так что s - это вход, а buffer - это выход. Кроме того, вы всегда должны проверить, что возвращаемое значение от sscanf равно количеству запрошенных предметов.
  • в петле while, я добавил проверку t < MAXT, чтобы избежать пробегая мимо конца массива указателей
  • search является массивом указателей, и strtok возвращает указатель, так что линия search[t++]=token; хранит указатель в массив. Сама строка по-прежнему находится в buffer.
+1

@harekuin Примечание: это работает, потому что 'strtok' заменяет разделитель ('+') нулевым символом. –

+0

omg вы, ребята, пользователь3386109 большое вам спасибо за подробное объяснение и @JohnnyMopp за все ссылки, которые вы отправили мне и комментарии! это очень помогло! – harekuin

+0

только быстрый вопрос. почему мне не нужно набирать cast calloc? Я думал, что это обязательно – harekuin

1

Эта линия здесь:

strcpy(&search[k],"\0"); 

Что вы делаете, добавив строку буквального «\ 0» в положение k-го в памяти (которая работает ... но брутто). Я считаю, что вы пытаетесь сделать это:

search[k] = '\0' 

Уведомление одинарные кавычки («»), который является символом, а не строковый литерал.

Вы также не должны быть casting a malloc:char *search = (char *)malloc(...)

ОСНОВНОМ:

Вы также должны учитывать, что printf("%s", string) только не печатает вплоть до ближайшего терминатора ('\0') в 'строка'. Ссылка here.

Так проверьте, что вы буферизацию, и посмотреть, если вы можете построить новые выводы ...

И при печати строки, вам нужно всего лишь printf("%s", search)

Я настоятельно рекомендую вы используйте malloc(), особенно для строк. Поскольку calloc() инициирует все значения до нуля. И '\0' == 0, чтобы вы могли затруднить себе диагностику.

+0

У меня первоначально был оператор printf внутри цикла while, чтобы проверить буфер и токен и часть, которая был помещен в malloc, но он отлично работает внутри петли, но в тот момент, когда я покидаю петлю while, smt идет не так. Я изначально также написал код, чтобы это было так: while (tok! = NULL) { strcpy (поиск, ток) поиск ++; tok = strtok (NULL, "+"); } У меня было впечатление, что мы должны разыгрывать, чтобы поместить smt внутри malloc, но, по-видимому, нет ??? Я не понимаю, как это работает. (и до сих пор не покидает цикл) – harekuin

+0

Я думаю, что поможет вашему пониманию тот факт, что 'search [5] == * (search + 5)' ... Итак, используя это, вы сможете увидеть, что вы делаете, когда используете 'strcpy (& search [k] ...)' – Matthew

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