2301_81829019 2024-04-18 18:05 采纳率: 66.7%
浏览 3
已结题

C++串的赋值,不知道哪出问题了,我照着标准copy的,但还是出错了

Assign函数有问题,使赋值出现错误

/*********************************************************************
    程序名:
    版权:
    作者:
    日期: 2024-04-16 21:58
    说明:
*********************************************************************/
#include <iostream>
#define MaxSize 100

typedef struct {
    char data[MaxSize];
    int length;
} SqString;

void Assign(SqString &s, char str[]) {
    int i = 0;
    while (str[i] != '\0') {
        s.data[i] != str[i];
        i++;
    }
    s.length = i;
}

void DestroyStr(SqString s)
{ }

void StrCopy(SqString &s, SqString t) {
    int i;
    for (i = 0; i < t.length; i++)
        s.data[i] = t.data[i];
    s.length = t.length;
}

int StrLength(SqString s) {
    return (s.length);
}

int StrEqual(SqString s, SqString t) {
    int i = 0;
    if (s.length != t.length)
        return (0);
    else {
        for (i = 0; i < s.length; i++)
            if (s.data[i] != t.data[i])
                return 0;
        return 1;
    }
}

SqString Concat(SqString s, SqString t) {
    SqString r;
    int i, j;
    for (i = 0; i < s.length; i++)
        r.data[i] = s.data[i];
    for (j = 0; j < t.length; j++)
        r.data[s.length + j] = t.data[j];
    r.length = i + j;
    return r;
}

SqString SubStr(SqString s, int i, int j) {
    SqString t;
    int k;
    if (i < 1 || i > s.length || j < 1 || i + j > s.length + 1)
        t.length = 0;
    else {
        for (k = i - 1; k < i + j - 1; k++)
            t.data[k + 1 - i] = s.data[k];
        t.length = j;
    }
    return t;
}

int Index(SqString s, SqString t) {
    int i = 0, j = 0;
    while (i < s.length && j < t.length) {
        if (s.data[i] == t.data[j]) {
            i++;
            j++;
        } else {
            i = i - j + 1;
            j = 0;
        }
    }
    if (j >= t.length)
        return i - t.length + 1;
    else
        return 0;
}

int InsStr(SqString &s, int i, SqString t) {
    int j;
    if (i < 1 || i > s.length + 1)
        return 0;
    else {
        for (j = s.length - 1; j >= i - 1; j--)
            s.data[j + t.length] = s.data[j];
        for (j = 0; j < t.length; j++)
            s.data[i + j - 1] = t.data[j];
        s.length = s.length + t.length;
        return 1;
    }
}

int DelStr(SqString &s, int i, int j) {
    int k;
    if (i < 1 || i > s.length || j < 1 || i + j > s.length + 1)
        return 0;
    else {
        for (k = i + j - 1; k < s.length; k


/*********************************************************************
    程序名:
    版权:
    作者:
    日期: 2024-04-16 22:36
    说明:
*********************************************************************/
#include <iostream>
#include "SqString.cpp"
using namespace std;

void match(SqString s, SqString t) {
    int i = 0, j = 0, max = i;
    int count, maxcount = 0;
    while (i < s.length) {
        j = i + 1;
        count = 1;
        while (j < t.length && s.data[i] == t.data[j]) {
            i++;
            j++;
            count++;
        }
        if (count > maxcount) {
            max = i;
            maxcount = count;
        } else {
            i = i - j + 1;
            j = 0;
        }
    }
    if (maxcount > 1) {
        printf("最大相同子串为:");
        int i = max;
        for (i; i < max + maxcount; i++)
            printf("%c", s.data[i]);
        printf("\n");

    }

}

int main() {
    SqString s, t;
    char s1[] = "abcdef";
    char s2[] = "bcdeg";
    Assign(s, s1);
    Assign(t, s2);
    printf("s:");
    DispStr(s);
    printf("t:");
    DispStr(t);
//    match(s, t);
    return 0;
}

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-04-18 18:05
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在提供的代码中,Assign 函数的目的是将一个C风格的字符串str[]赋值给一个SqString类型的字符串s。然而,代码中存在一个明显的错误,导致了赋值操作出现问题。

    问题在于Assign函数中的这行代码:

    s.data[i] != str[i];
    

    这行代码实际上执行的是不相等比较操作,而不是赋值操作。它比较了s.data[i]str[i],但并没有将str[i]的值赋给s.data[i]。正确的赋值操作应该使用单个等号=,而不是!=

    正确的Assign函数应该如下所示:

    void Assign(SqString &s, char str[]) {
        int i = 0;
        while (str[i] != '\0') {  // 遍历str直到遇到字符串结束标志'\0'
            s.data[i] = str[i];   // 将str的每个字符赋值给s.data
            i++;
        }
        s.length = i;  // 赋值完成后,更新s的长度
    }
    

    此外,代码中还有一个潜在的问题,Assign函数的参数SqString &s使用的是引用传递,这样可以避免复制整个SqString结构,提高效率。但是,如果Assign函数被错误地实现为非引用传递(如原始代码中所示),那么它将不会正确地修改传入的SqString对象。

    以下是修改后的完整Assign函数,包括正确的参数传递方式:

    void Assign(SqString &s, char str[]) {
        int i = 0;
        while (str[i] != '\0') {
            s.data[i] = str[i];
            i++;
        }
        s.length = i;
    }
    

    请确保在实际的程序中使用这个修正后的Assign函数,并且所有的函数调用都使用正确的参数传递方式。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月18日
  • 已采纳回答 4月18日
  • 创建了问题 4月18日

悬赏问题

  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码