2014-02-18 1 views
-2
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

int main(int argc,char *argv[]) 
{ 
char *args[10]; 
int i=0; 
char str[41], teststr[41]; //two arrays declared here 
const char delimiter[2]=" "; 
printf("Enter command:"); 
scanf("%s", str); 
memcpy(teststr, str, sizeof(str)); 
args[i]=strtok(teststr, delimiter); 
while(args[i]!=NULL)     
{         
printf("args[%d]=%s", i, args[i]); 
i++; 
args[i]=strtok(teststr, delimiter); 
} 
return 0; 
} 

memcpy() - это функция для копирования одного массива в другой. strtok() - это функция для разделения строки на токены. Мы будем циклически перемещать его до тех пор, пока в строке не останется токенов. Каждый токен хранится в 'argv []', который является массивом символов.Ошибка сегментации при разделении токенов со строки

+0

Во втором вызове strtok измените teststr на NULL. Кроме того, вместо проверки, является ли args [i] нулевым, проверьте i на argc. – cup

+0

http://www.cplusplus.com/reference/cstring/strtok/: 'В последующих вызовах функция ожидает нулевой указатель ...' –

+1

Часть man-страницы 'strok' говорит:« В каждом последующем вызове, который должен анализировать одну и ту же строку, str должен быть NULL. ". Вы пропускаете 'teststr' каждый раз, поэтому цикл, скорее всего, не закончится (т.е.' args [i] 'никогда не будет' NULL'. – Evert

ответ

0

Цикл while будет работать бесконечно, так как arg[i], который является первым токеном, продолжает делать при переходе состояния к бесконечному.

Поскольку вы используете scanf() для чтения в строку, если строка содержит многословное слово, которое невозможно прочитать, поскольку ваш код не может разобрать все токены, а только первое слово. Я предлагаю вам использовать fgets(), как показано ниже, чтобы прочитать строку нескольких слов,

if (fgets(str, sizeof str, stdin) == NULL) { 
    ; // handle EOF 
} 

Вот рабочий код ideone.

+0

Это работает отлично. Спасибо !!! – Malhar

0

Я не уверен, что это удалит segfault для вас, но вы не звоните strtok вправо. Вы только передаете разделитель при первом вызове. При последующих вызовах к нему второй аргумент должен быть NULL. То, как вы в настоящее время называете это, обязательно сломает вам вещи.

+0

Фактически, man-страница говорит: «При первом вызове strtok() строка, подлежащая анализу, должна быть указана в« str ». В каждом последующем вызове, который должен анализировать одну и ту же строку,« str »должен быть NULL.» Здесь 'str' является первым параметром, а «разделителем» является второй параметр. – Malhar

0

Пожалуйста, измените while..loop по

while(args[i]!=NULL)     
{         
     printf("args[%d]=%s", i, args[i]); 
     i++; 
     args[i]=strtok(NULL, delimiter); 
} 

вам не нужно каждый раз проходить teststr в strtok иначе while...loop идет в бесконечный цикл.

+0

Да, я сделал это, но тогда цикл выполнялся только один раз – Malhar

+0

@ user1478588 да, но это зависит от того, что вы вводите в 'scanf' вы можете указать, какую строку вы вводите в input для' scanf'. Также, почему вы берете массив для 'args', достаточно только' char * args'. –

+0

На самом деле я делаю оболочку. Поэтому, когда я пишу такие команды, как «cat shell.c», тогда args [0] = 'cat' и args [1] = 'shell.c' – Malhar

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