2 guyueshuicao Guyueshuicao 于 2016.04.07 14:46 提问

C++菜鸟关于利用数组实现字符串相关操作的提问

打算利用数组实现关于顺序串的一些操作,程序源代码如下:

#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"
#include
using namespace std;

#define OK 1

void output(char *s) //2.输出串
{
if(s[1]='0')
cout<<"该串为空串,请重新输入!"<<endl;
else
cout<<s<<endl;

}

void input(char s[]) //1.输入串
{

cout<<"请输入串:"< cin>>s;

}

int length(char s[]) //3.计算串的长度
{
int i=0;
if(s[0]='0')
cout<<"该串为空串,请重新输入!"<<endl;
else
{
while(s[i]!='\0')
i++;
cout<<"该串长为:"<<i<<endl;
}

return i;

}

void Insert(char s[], int i, char t[]) //4.在串s的第i个位置插入串s1形成串s2
{

char q[255];
strcpy(q,s);

if(i>length(s)-1)
    cout<<"插入位置超出串长,请重新输入"<<endl;
else
{
    if(length(q)+length(t)>255)
        cout<<"overflow"<<endl;

else
{   
    for(int j=length(q)-1;j>=i;j--)
        q[j+length(q)]=q[j];
    for(j=0;j<length(t);j++)
        q[j+i]=t[j];
}
cout<<q<<endl;
}

}

void del(char s[],int i,int j) //5.从在串s的第i个字符开始连续删除j个字符形成串s3
{

char q[255];
strcpy(q,s);
int len=length(q);
if((i<0)||(i<len))
cout<<"i值不在串长度范围内,不能删除"<<endl;
else
{
for(int k=i+j;k<len;k++)
q[k-j]=q[k];
cout<<q<<endl;
}

}

void replace(char s[],int i,int j,char t[]) //6.将串s的第i个字符开始的j个字符替换成串s1而产生串s4
{
char q[255];
strcpy(q,s);

int lens=length(s);
int lent=length(t);

if((lent>j)||(lens-i<j))
    cout<<"串s的剩余长度不足,请重新选择位置i"<<endl;
else
{
    for(int k=0;k<j;k++)
        q[i-1]=t[k];
    cout<<q<<endl;
}

}

void substr(char s[],int i,int j) //7.提取串s的第i个字符开始的j个字符而产生串s5
{
char q[255];
strcpy(q,s);

int lens=length(s);

if((j>lens)||(lens-i<j))
    cout<<"串s的剩余长度不足,请重新选择位置i"<<endl;
else
{
    char p[255];
    for(int k=0;k<j;k++)
    {
        p[k]=q[i];
        i++;
    }
    cout<<p<<endl;
}

}

void contact(char s[],int i,char t[]) //8.将串s1和串s2连接起来而产生串s6
{
char q[255];
strcpy(q,s);

if(i>length(s)-1)
    cout<<"插入位置超出串长,请重新输入"<<endl;
else
{
    if(length(q)+length(t)>255)
        cout<<"overflow"<<endl;

else
{   
    for(int j=length(q)-1;j>=i;j--)
        q[j+length(q)]=q[j];
    for(j=0;j<length(t);j++)
        q[j+i]=t[j];
}
}

char p[255];

int lens=length(s);
int lenq=length(q);

if(lens+lenq>255)
    cout<<"overflow"<<endl;
else
{
    for(int m=0;m<lens-1;m++)
        p[m]=s[m];
    for(int n=0;n<lenq-1;n++)
        p[n+m+1]=q[n];
    cout<<p<<endl;
}

}

void index(char s[],char t[]) //9.求子串s1在s中位置
{
int i=0,j=0;

int lens=length(s);
int lent=length(t);

while((i<lens)&&(i<lent))
{
    if(s[i]==t[j])
    {
        i++;
        j++;
    }
    else
    {
        i=i-j+1;
        j=0;
    }
    if(j>=lent)
        cout<<i-lent<<endl;
    else
        cout<<"并未在串s中找到与串s1匹配的子串"<<endl;
}

}

char menu() //选择菜单
{
char i;
printf("----------------请选择相应操作:-----------\n");
printf("----------------a.输出串s-----------------\n");
printf("----------------b.输出串s1----------------\n");
printf("----------------c.求s串长-----------------\n");
printf("----------------d.求s1串长----------------\n");
printf("----------------e.在串s的第i个位置插入串s1形成串s2----------------\n");
printf("----------------f.从在串s的第i个字符开始连续删除j个字符形成串s3---------------\n");
printf("----------------g.将串s的第i个字符开始的j个字符替换成串s1而产生串s4-----------\n");
printf("----------------h.提取串s的第i个字符开始的j个字符而产生串s5----------------\n");
printf("----------------i.将串s1和串s2连接起来而产生串s6 ----------------\n");
printf("----------------j.求子串s1在s中位置----------------\n");

i=getch();
return i;

}

void main()
{

char s[255],s1[255];


cout<<"请输入串s:"<<endl;
cin>>s;
cout<<"请输入串s1:"<<endl;
cin>>s1;

while(1)
{
char model=menu();
    switch(model)
    {
        output(s);          
        break;

    case 'b':
        output(s1);
        break;

    case 'c':
        length(s);
        break;

    case 'd':
        length(s1);
        break;

    case 'e':
        cout<<"请输入插入位置i:"<<endl;
        int i;
        cin>>i;

        Insert(s,i,s1);
        break;

    case 'f':
        cout<<"请输入插入位置i:"<<endl;
        int a;
        cin>>a;
        cout<<"请输入删除字符数j:"<<endl;
        int j;
        cin>>j;

        del(s,a,j);
        break;

    case 'g':
        cout<<"请输入插入位置i:"<<endl;
        int b;
        cin>>b;
        cout<<"请输入替换字符数j:"<<endl;
        int c;
        cin>>c;

        replace(s,b,c,s1);
        break;

    case 'h':
        cout<<"请输入开始位置i:"<<endl;
        int d;
        cin>>d;
        cout<<"请输入提取字符数j:"<<endl;
        int e;
        cin>>e;

        substr(s,d,e);
        break;

    case 'i':
        cout<<"请输入生成串2时插入的位置i"<<endl;
        int f;
        cin>>f;
        contact(s,f,s1);
        break;

    case 'j':
        index(s,s1);
        break;
    }
}

}

现在的问题就是不管我字符串输入的是什么,输出和计算长度的函数总是显示“该串为空请重新输入”。

是数组的内容没办法传入吗?我尝试过把算长度的函数改到主函数里面来,但是还是不行,所以是数组的内容没有更新?

C++菜鸟,可能很多问题都很幼稚,求各位不吝指教!谢谢!

3个回答

HOLY3KILL
HOLY3KILL   2016.04.07 18:16
已采纳
 int length(char s[]) //3.计算串的长度
{
    int i = 0;
    if (s[0] = '0')**这里也是一样,写成赋值符号了,改为==**
        cout << "该串为空串,请重新输入!" << endl;
    else
    {
        while (s[i] != '\0')
            i++;
        cout << "该串长为:" << i << endl;
    }

给一个小小的建议,LZ的菜单做的有点复杂,而且很占屏幕,建议在每一个case后面加上
system("CLS")清一下屏

 case 'b':
 system("CLS")//加在这
        output(s1);
        break;

Guyueshuicao
Guyueshuicao 谢谢答疑!帮大忙了!果然是菜鸟。。。这么低级的错误犯了。。_(:зゝ∠)_
一年多之前 回复
CSDNXIAOD
CSDNXIAOD   2016.04.07 15:17

字符串与数组的相关操作
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

HOLY3KILL
HOLY3KILL   2016.04.07 18:13

我擦。。。大兄弟,你这代码写得略微有点乱

 void output(char *s) //2.输出串
{
if(s[1]='0')      ////**这里你写成赋值符号了,应该改为==**
cout<<"该串为空串,请重新输入!"<<endl;
else
cout<<s<<endl;

}
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!