2013-06-04 4 views
0

Поэтому я должен использовать fscanf для сканирования абзаца (слов) в текстовом файле и написал следующий код, и он должен работать теоретически, но я не очень признателен за любую помощь.Fscanf and Strings

Фрагмент кода:

char foo[81]; 
char *final[MAXIUM]; //this is another way of making a 2d array right? 
int counter=0; 

while (counter<MAXIUM && fscanf(file, "%s", foo)!= EOF){ 
    *final = (char*)malloc(strlen(foo)*sizeof(foo)); 
    //if (final ==NULL) 
    *(final + counter) = foo + counter; 

    counter++; 
} 

Текстовый файл выглядит как любой старый пункт:

Однако компания пока не отвечает на запросы социальных медиа своих клиентов. Вы можете быть активным энтузиастом социальных сетей или поклонником этого.


Суть этого бита кода является сканирование абзац из текстового файла, используя% s и fscanf только тогда выделение достаточного пространства для каждого слова и положить его в финале (Foo является временным только для бит сканирования, это нужно сделать так). Мы знаем максимальные слова, прочитанные через MAXIUM.

Спасибо за вашу помощь:

+0

какая ошибка вы пытались исправить это? – nsd

+0

Отсутствует ошибка, но при печати слова используется для (counter = 0; i user2435013

+2

'fscanf (foo,"% s ", foo)'? –

ответ

-1

Я думаю, вы должны быть изменить код, для корректного выходного массового

while (counter<MAXIUM && fscanf(foo, "%s", foo)!= EOF){ 

    /* the strlen(foo) + 1 for store '\0' */ 
    final + counter = (char*)malloc((strlen(foo) + 1)*sizeof(foo)); 
    /* to copy the "foo" content to final + n */ 
    strcpy(final + counter, foo, strlen(foo)); 
    /* each time should clear the foo array */ 
    memset(foo, 0, 81); 

    counter++; 
} 
+0

Не думаю, что я могу использовать memcpy для своих целей (мне нужно это понять без использования посторонних функций). Извините :( – user2435013

+0

уверен, что strcpy будет лучше для обработчика строк. – syler

+1

вам не нужно 'memcpy (...)' вы можете просто использовать 'strcpy (final [counter], foo)' –

1

Изменить

while (counter<MAXIUM && fscanf(foo, "%s", foo)!= EOF){ 
    *final = (char*)malloc(strlen(foo)*sizeof(foo)); 
    *(final + counter) = foo + counter; 
.... 
for(counter=0; i<MAXIMUM; counter++) printf("%s",final[counter]) 

к

// Also recommend that the first thing you do is fill your `final[]` with NULL, 0 
for (int j=0; j<MAXIUM; j++) final[j] = 0; 

// changed fscanf to fgets. Less issues with dropping whitespace. 
while ((counter<MAXIUM) && (fgets(foo, sizeof(foo), stdin)!= EOF)){ 
    final[counter] = (char*)malloc(strlen(foo)+1); // some say (char*) cast is undesirable, bit allowed. 
    strcpy(final[counter], foo); 
    // eliminate *(final + counter) = foo + counter; 
... 
for(i=0; i<counter; i++) printf("%s",final[i]); // The fgets() will preserve the EOL 
+0

Может использовать 'strdup (foo)' вместо '(char *) malloc (strlen (foo) +1)' и strcpy() – chux