从字符串中分离令牌时出现分段错误

时间:2014-02-18 12:59:38

标签: c unix

#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 []'中,这是一个char数组。

3 个答案:

答案 0 :(得分:0)

我不确定这是否会为您删除段错误,但您没有正确调用strtok。您只能在第一次调用时传递分隔符。在随后的调用中,第二个参数应为NULL。你当前称之为的方式必将为你打破局面。

答案 1 :(得分:0)

while循环将无限运行,因为arg[i]是第一个令牌继续进行,而条件传递导致无限。

由于您使用scanf()读取字符串,如果字符串是多字,则无法读取,使您的代码无法解析所有令牌,只能解析第一个字。我建议您使用下面的fgets()来阅读多字符串

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

以下是工作代码ideone

答案 2 :(得分:0)

请按

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

您不需要每次都在teststr中传递strtok,否则while...loop会进入无限循环。