不使用库函数修改字符数组的内容
如:输入”student a am i”,将内容改为”i am a student”.
// 编程入门新手、可能算法笨拙,大佬手下留情。
编程思路*
主题思路、将输入的字符串拆分成只有一个单词的字符串存储在数组中、然后再将各个只有一个单词的数组按照顺序重新排布在一个新的数组中从而完成修改。实现主要用到for循环、if判定、strlen字符串长度计算、malloc动态一维、二维数组建立。
实现方法
- 将输入的字符串存储在足够大的数组中,然后计算出整个数组中有几个字母串(可以理解为单词数),计算时注意字符串开头是什么?是空格还是直接就是字母串(单词)。在这可能大家想问为什么要计算单词个数,其主要目的就是为了建立动态二维数组来存储单词。
//count为字符串大小,a[size]为输入的字符串数组
for(i=0; i<count; i++)
//通过循环消除刚开始就是空格的状况,同时i记录了第一个单词的开头
{
if(a[i] != ' ')
break;
}
for(j=i; j<count; j++)
{
if(a[j] ==' '&& a[j+1] != ' ')
count_num ++;//单词个数
}
-计算出个数后建立二维动态数组
uni=(char**) malloc (sizeof(char*)*count_num);//uni[count_num][]
for(j=0; j<count_num; j++)
uni[j]=(char*) malloc (sizeof(char)* count);
//uni[count_num][count],建立后对数组进行初始化,给后面合并做出标志
for(k=0;k<count_num;k++)
for(j=0;j<count;j++)
uni[k][j]=0;//在这对数组初始化为0
-抽取a[size]中的单词
//sum_x与sum_y都为整形初始值为0
for(j=i; j<count; j++)//i记录的第一个单词的开头
{
if(a[j] != ' ')
//判定一直是单词 例如 asdasd dasd 从a开始抽取一直到空格时暂时停止抽取
{
uni[sum_x][sum_y]=a[j];
//每次执行将sum_y自增1,j也随着for循环自增1.
sum_y++;
}
if(a[j]==' '&& a[j+1] != ' ')
//当读到某个空格且空格下个字符不是空格(即字母时)将sum_x自增1,同时sum_y置零
{
sum_x++;
sum_y=0;
}
}
-将二维数组中的单词、 倒序 、重新拼接
//b为一个一维数组,可定义为动态数组,大小为输入字符串的大小加1,最后位存储/0标志,sum_b初始值为0
for(i=sum_x; i>=0; i--)
//sum_x保持抽取时的值直接赋给i从a[sum_x][0]开始给
{
for(j=0; j<=count; j++)
{
//uni[][]初始化时所有值都为0,当读取到0时说明刚抽取的字符已经读完,则跳到下一维中
if(uni[i][j] == 0)
{
break;
}
b[sum_b]=uni[i][j];
sum_b++;
}
if(sum_b == count)//是否读完了为最后一个单词的,是的话跳出
break;
//此处存在一个不影响的bug当输入时以n个空格开头时,b的空间可能会多出n个字节
b[sum_b]=' ';
sum_b++;
}
b[sum_b]=0;//给最后一位赋0即/0
puts(b);
-最后附上源码供大家参考
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 20
char* hanshu (char* a,char* b)
//函数功能将第一个数组中的字母串倒序排列在第二个字母串,同时可以返回第二个数组的指针,也可以不返回,输入b的空间不能小于a。
{
int count=strlen(a);
int i,j,k;
int count_num=1;
char ** uni;
int sum_x=0;
int sum_y=0;
int sum_b=0;
for(i=0; i<count; i++)
{
if(a[i] != ' ')
break;
}
for(j=i; j<count; j++)
{
if(a[j] ==' '&& a[j+1] != ' ')
count_num ++;
}
uni=(char**) malloc (sizeof(char*)*count_num);
for(j=0; j<count_num; j++)
uni[j]=(char*) malloc (sizeof(char)* count);
for(k=0;k<count_num;k++)
for(j=0;j<count;j++)
uni[k][j]=0;
for(j=i; j<count; j++)
{
if(a[j] != ' ')
{
uni[sum_x][sum_y]=a[j];
sum_y++;
}
if(a[j]==' '&& a[j+1] != ' ')
{
sum_x++;
sum_y=0;
}
}
for(i=sum_x; i>=0; i--)
{
for(j=0; j<=count; j++)
{
if(uni[i][j] == 0)
{
break;
}
b[sum_b]=uni[i][j];
sum_b++;
}
if(sum_b == count)
break;
b[sum_b]=' ';
sum_b++;
}
printf("%d\n",sum_b);
b[sum_b]=0;
free(uni);
return b;
}
int main (void)
{
char a[size]={0};
char* b ;
printf("please enter chars.\n");
gets(a);
b=(char*)malloc(sizeof(char)*(strlen(a)+1));
hanshu(a,b);
puts(b);
free(b);
return 0;
}