2014-02-18 63 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]是否为空,请检查我是否对argc。 – cup

+0

http://www.cplusplus.com/reference/cstring/strtok/:'在随后的调用中,函数需要一个空指针...' –

+1

'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

我不确定这是否会为您删除段错误,但您没有拨打strtok右侧。您只能在第一次通话时传递分隔符。在随后的调用中,第二个参数应该是NULL。你目前称之为的方式肯定会为你打破一切。

+0

实际上手册页说:“在第一次调用strtok()时,应该在'str'中指定要解析的字符串,在每一个应该解析同一个字符串的后续调用中,'str'应该为NULL。' '是第一个参数,'delimiter'是第二个参数 – Malhar

0

请通过

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

改变while..loop您不必每次都通过teststrstrtok否则while...loop进入无限循环。

+0

是的,我做到了,但循环只执行一次 – Malhar

+0

@ user1478588是的正确,但它取决于你给的输入'scanf'你可以给你输入哪一个字符串给'scanf'.Also为什么你需要'args'的数组只有'char * args'就足够了。 –

+0

其实我正在制作一个外壳。所以当我编写'cat shell.c'这样的命令时,args [0] ='cat'和args [1] ='shell.c' – Malhar