Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在c字符串中搜索和替换子字符串_C_String - Fatal编程技术网

在c字符串中搜索和替换子字符串

在c字符串中搜索和替换子字符串,c,string,C,String,我对搜索和替换另一个字符串中的子字符串有疑问 我有一些str字符串,带有姓名和****而不是出生年份,还有mat矩阵数组(3d数组)。 该矩阵包含有关人员的详细信息(fName、lName和出生年份)。 我需要的是运行str并取名字(可以是第一个或最后一个),运行矩阵并找到该人的年份(如果有多人同名,请写第一个) 我试过: void fillYears(char* mat[][M], int rowsNum, char str[MAX_INPUT]){ char *token,*token

我对搜索和替换另一个字符串中的子字符串有疑问

我有一些
str
字符串,带有姓名和****而不是出生年份,还有
mat
矩阵数组(3d数组)。 该矩阵包含有关人员的详细信息(fName、lName和出生年份)。 我需要的是运行
str
并取名字(可以是第一个或最后一个),运行矩阵并找到该人的年份(如果有多人同名,请写第一个)

我试过:

void fillYears(char* mat[][M], int rowsNum, char str[MAX_INPUT]){
   char *token,*token2;
   char tmpStr[MAX_INPUT];
   int i,index = 0;
   char subStr[2] = "\n";
   strcpy(tmpStr,str);
   /* get the first token */
   token = strtok(tmpStr, subStr);
   index+=strlen(token)+1;
   /* walk through other tokens */
   while( token != NULL ) 
   {
       token2 = strtok(token, " ");
       //walk through the matrix
       for(i=0;i<rowsNum;i++){
           // check first name and last name if the same as token name
           if(strcmp(mat[i][0],token2) == 0 || strcmp(mat[i][1],token2) == 0)
           {
               str[index-5] = mat[i][2][0];
               str[index-4] = mat[i][2][1];
               str[index-3] = mat[i][2][2];
               str[index-2] = mat[i][2][3];
               break;
           }
       }

      token = strtok((str+index), subStr);
      index+=strlen(token);
   }
}

void main(){
    char * inputStr[NUM_OF_ROWS][M];
    char str[MAX_INPUT] = "aa ****\nbbb ****\ncc ****\n";
    inputStr[0][0] = "aa";
    inputStr[0][1] = "aaa";
    inputStr[0][2] = "1111";
    inputStr[1][0] = "bb";
    inputStr[1][1] = "bbb";
    inputStr[1][2] = "2222";
    inputStr[2][0] = "cc";
    inputStr[2][1] = "ccc";
    inputStr[2][2] = "3333";
    fillYears(inputStr,3,str);
}
void fillYears(char*mat[][M],int rowsNum,char str[MAX_INPUT]){
char*token,*token2;
字符tmpStr[最大输入];
int i,指数=0;
字符subStr[2]=“\n”;
strcpy(tmpStr,str);
/*获取第一个令牌*/
令牌=strtok(tmpStr,subStr);
索引+=strlen(令牌)+1;
/*浏览其他代币*/
while(令牌!=NULL)
{
令牌2=strtok(令牌“”);
//遍历矩阵

对于(i=0;i更好的方法可能是使用正则表达式。除此之外,您还必须进行代码检查。
strtok
是危险的,最好使用
strep
例如…”我得到了错误。“什么错误?@0andriy感谢您的帮助advice@RadLexus抱歉,错误是:0x5b37d540处未处理的异常(msvcr100d.dll)在abc.exe中:0xC0000005:访问冲突读取位置0x00000000。对“strtok”的第二次和后续调用(例如在while循环底部调用时)应将NULL作为第一个参数传递-即strtok(NULL,substr)-不要忘了它可以返回NULL,因此您不想对其调用strlen!(事实上,这也可能是您的访问违规的原因)