C 如何使用strtok

C 如何使用strtok,c,C,下面是codewars培训的解决方案。 我收到这样的错误信息,怎么了? 我想这可能是strtok函数的一部分,但请告诉我出了什么问题 #include <stdlib.h> #include <string.h> double pos_average(char *s, unsigned n) { char **matrix; char *p; unsigned int i, j, k; unsigned int subst_len = ( strchr(

下面是codewars培训的解决方案。

我收到这样的错误信息,怎么了? 我想这可能是strtok函数的一部分,但请告诉我出了什么问题

#include <stdlib.h>
#include <string.h>
double pos_average(char *s, unsigned n)
{
  char **matrix;
  char *p;
  unsigned int i, j, k;
  unsigned int subst_len = ( strchr(s,',') - s  ) / sizeof(char);
  double count = 0;
  
  matrix = (char**)calloc( n + 1  ,sizeof(char*) );
  if(!matrix) exit(0);
  
  for(i = 0; i < n; i++)
  {
    matrix[i] = (char*)calloc( subst_len + 1 ,sizeof(char) );
    if(!matrix[i]) exit(0);
  }
    
  for(i = 0; i < n; i++)
  {
    if(i == 0){
      p = strtok(s, " ");
      strncpy(matrix[i], p, subst_len);
    }
    else{
      p = strtok(NULL," ");
      strncpy(matrix[i], p, subst_len);
    }
  }  

  for(i = 0; i < n - 1; i++)
  {
    for(j = i + 1; j < n; j++)
    {
      for(k = 0; k < subst_len; k++)
      {
        if(matrix[i][k] == matrix[j][k]) count++;
      }     
    }        
  }
   
  for(i = 0; i < n; i++) free(matrix[i]);
  free(matrix);
  
  return (count / (  ( (double)n * ( (double)n - 1.0 ) )  / 2.0 ) ) * 100.0;
}
#包括
#包括
双位置平均值(字符*s,无符号n)
{
字符**矩阵;
char*p;
无符号整数i,j,k;
无符号整数subst_len=(strchr(s,,)-s)/sizeof(char);
重复计数=0;
矩阵=(char**)calloc(n+1,sizeof(char*);
如果(!矩阵)退出(0);
对于(i=0;i
所以您没有尝试在调试器中自己运行它,以查看故障发生的位置?
strtok
可以返回NULL。你需要检查并处理它。@我还不太习惯调试,但我做过调试。然后变量“矩阵[i]”和“计数”的值是正确的。因此,我认为“strtok”的用法很奇怪,内存被非法访问。通过
s
传递的字符串是否可修改?如果传递的是字符串文字,或者指向一个字符串的
char*
,它可能是有效的只读。由于
strtok()
在找到令牌时修改字符串,这可能会导致崩溃。首先尝试将字符串放入(非常量)数组中。
#include <stdlib.h>
#include <string.h>
double pos_average(char *s, unsigned n)
{
  char **matrix;
  char *p;
  unsigned int i, j, k;
  unsigned int subst_len = ( strchr(s,',') - s  ) / sizeof(char);
  double count = 0;
  
  matrix = (char**)calloc( n + 1  ,sizeof(char*) );
  if(!matrix) exit(0);
  
  for(i = 0; i < n; i++)
  {
    matrix[i] = (char*)calloc( subst_len + 1 ,sizeof(char) );
    if(!matrix[i]) exit(0);
  }
    
  for(i = 0; i < n; i++)
  {
    if(i == 0){
      p = strtok(s, " ");
      strncpy(matrix[i], p, subst_len);
    }
    else{
      p = strtok(NULL," ");
      strncpy(matrix[i], p, subst_len);
    }
  }  

  for(i = 0; i < n - 1; i++)
  {
    for(j = i + 1; j < n; j++)
    {
      for(k = 0; k < subst_len; k++)
      {
        if(matrix[i][k] == matrix[j][k]) count++;
      }     
    }        
  }
   
  for(i = 0; i < n; i++) free(matrix[i]);
  free(matrix);
  
  return (count / (  ( (double)n * ( (double)n - 1.0 ) )  / 2.0 ) ) * 100.0;
}