题目:有一段文本,将文本中的所有单词,存放到一个字符指针数组中(要求每个单词内存恰好)。


第一种做法



charc[] =" asd afil kjgl rip kjgdr gds sdg gs ";

charb[10] = {0};

char*a[10] = {NULL};

inti =0, j =0,k =0; //i使字符不断后移,j用来标识指针a,k用来标识中间字符数组b;

while(1) {//把字符串的'\0' 作为if判断的条件,避免遇到\0不在判断

if(c[i] !=' '&& c[i] !='\0') {

b[k++] = c[i++];

continue;//提高效率,当进行此if判断时,就不在进行一下if判断

}

if((c[i] ==' '|| c[i] =='\0') && k !=0) {

//k判断是否有字符赋给b数组,没有的话意味着前面是空空格,就不在需要进行判断,提高运行效率

b[k] ='\0'; //给数组b加上\0 ,结束字符

a[j] =malloc(strlen(b) +1);//为指针开辟空间

strcpy(a[j], b); //b是首地址,a[j]也是首地址,函数具有复制功能,如:%s

k =0;

j++;

}

if(c[i] =='\0') { //把while中的\0判断移到可以先判断\0的情况

break;

}

i++;

}

for(inti =0; i < j ; i++ ) {

printf("%s\n", a[i]); //int a = 10; int *b = null; b = &a; *b = 10;

free(a[i]); //* 具有指向功能,

a[i] =NULL;

}


第二种做法



charstr[] =" a41 a1421 b3511 b b c c c c dddddd jkthku";

//2.如何存储一个单词?

chartempStr[20] = {0};//存储文本中的一个单词

//3.如何存储堆区空间的地址?

char*p[255] = {0};

//4.如何查找单词,并且将对应的单词存放到临时数组中?

inti =0;//标识str字符串中字符的下标

intj =0;//标识tempStr字符串中字符的下标

intk =0;//标识指针数组中元素的下标.

while(1) {

if(str[i] !=' '&& str[i] !='\0') {

//当获取到的元素不为空格时,将它存储到临时数组tempStr中.

tempStr[j++] = str[i];

}elseif(j !=0) {

//当遇到空格,或者遇到\0时.单词的存放结束

tempStr[j] ='\0';//最后一个元素补上\0

//动态计算所需堆区空间的大小,将地址存放到对应的字符指针数组元素中

p[k] = malloc(strlen(tempStr) +1);

//将临时数组tempStr中字符串拷贝到对应堆区空间上.

strcpy(p[k], tempStr);

k++;

j =0;//存储下一单词时,又从数组的第一个字符开始.

}

//当读取到\0时,字符串读取完毕,跳出循环

if(str[i] =='\0') {

break;

}

i++;//移动到str数组中的下一个元素

}

for(inti =0; i < k; i++) {

printf("%s ", p[i]);

free(p[i]);

p[i] =NULL;

}

第三种做法


charstr[50] =" qwo shi shui nishi hhdj";

chartemp[20] = {0};

char*p[10] = {0};

intcount =0;

intd =0,i =0,index =0,h =0;

while(str[i] !='\0') {

if(str[i] !=' ') {

count ++;

i ++;

index = i - count;

}

if(str[i] ==' '|| str[i] =='\0' ){

if(count !=0) {

intk =0;

for(intj = index; j < i;j ++) {

temp[k] = str[j];

k ++;

d = k;

}

temp[k] ='\0';

printf("%s\n",temp);

p[h] =malloc(count +1);

strcpy(p[h], temp);

h ++;

count =0;

}

i ++;

}

}

for(inti =0; i < h; i ++) {

printf("%s ",p[i]);

free(p[i]);

p[i] =NULL;

}

第四种做法


chara[] =" The end of the World Cup does not mean the end of international competition in Brazil this year";

char*p[100] = {0};//记录单词

chartemp[100] = {0};//临时记录单词

inti =0; //记录a[]数组元素的位置

intj =0; //记录单词的个数

intk =0; //记录temp[]数组中临时单词的字母个数(元素位置)

intcount =0;

while(a[i] !='\0') {

if((a[i] >='a'&& a[i] <='z') || (a[i] >='A'&& a[i] <='Z')) {

count++;

temp[k] = a[i];

k++;

}elseif(k !=0) {

temp[k] ='\0';

k =0;

p[j] = malloc(sizeof(char) * count +1);

strcpy(p[j], temp);

printf("%s ", p[j]);

free(p[j]);

p[j] =NULL;

j++;

count =0;

}

if(a[i +1] =='\0'&& a[i] !=' ') {

temp[k] ='\0';

k =0;

p[j] =malloc(sizeof(char) * count +1);

strcpy(p[j], temp);

printf("%s ", p[j]);

free(p[j]);

p[j] =NULL;

}

i++;

}


over