学习Redis的sds.c文件中,有一个关于将字符串分割到字符串数组中的代码,我学习并实现了一下,但没有考虑内存问题和其它的一些误操作的问题,换言之,只实现了最基本的功能。
//该程序实现的是将字符串分割成子字符串
/*例如输入"123/456/7/89/1","/"作为分隔符,
程序会返回:123 456 7 89 1
*/
#include<stdio.h>
#include<string.h>
void splitlen(char* str,int str_len,char* del,int del_len){
int cmp_len=str_len-del_len+1;
char result[10][10];
int index=0,start=0;
int j=0;
if(memcmp(str,del,del_len)==0)//去掉前面的分隔符,例如输入路径时:/home/zhangbo/C++/code,把最前面的"/"去掉
{
j=del_len;
start=del_len;
}
for(;j<cmp_len;j++){
if(memcmp(str+j,del,del_len)==0){
int copy_len=j-start;
strncpy(result[index],str+start,copy_len);
result[index][copy_len+1]='\0';
index++;
start=j+del_len;
}
}
strncpy(result[index],str+start,str_len-start);
result[index][str_len-start+1]='\0';
index++;
for(int i=0;i<index+1;i++)
{
printf(result[i]);
printf("\n");
}
}
int main(){
char* str="/123/45/678/90";
int str_len=14;
char* del="/";
int del_len=1;
splitlen(str,str_len,del,del_len);
//char result[100][100];
//strncpy(result[0],str,3);
//printf(result[0]);
return 0;
}
在实现过程中,我遇到了一些问题,总结在下面:
1.一个数组存放的是字符串,如何将这个数组输出?
#include<stdio.h>
int main(){
char* str[]={"abc","def","opq"};
int len=3;
for(int i=0;i<len;i++){
printf(str[i]);
}
return 0;
}
#include<stdio.h>
int main(){
char* str[3];//字符串个数不可省略
str[0]="abcd";
str[1]="efgh";
str[2]="ijkl";
int len=3;
for(int i=0;i<len;i++){
printf(str[i]);
}
return 0;
}
2.char **arr和char* arr[]的区别
char* arr[]可以在声明的时候确定数组的大小,但是char** arr却不可
之后我上网找了下相关资料,发现利用string.h中的strtok函数会更加方便。现将实现贴在下面,方便以后查找。
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "/home/zhangbo/C++/code/test";/*待分隔的原字符串*/
char seg[] = "/"; /*分隔符这里为逗号comma,分隔符可以为你指定的,如分号,空格等*/
char charlist[50][50]={""};/*指定分隔后子字符串存储的位置,这里定义二维字符串数组*/
int i =0;
char *substr= strtok(str, seg);/*利用现成的分割函数,substr为分割出来的子字符串*/
while (substr != NULL) {
strcpy(charlist[i],substr);/*把新分割出来的子字符串substr拷贝到要存储的charlsit中*/
i++;
printf("%s\n", substr);
substr = strtok(NULL,seg);/*在第一次调用时,strtok()必需给予参数str字符串,
往后的调用则将参数str设置成NULL。每次调用成功则返回被分割出片段的指针。*/
}
getchar();/*press enter key to continue*/
return 0;
}
1