为什么数组中存储了额外的数据

Why there is an extra data being store in the array?

本文关键字:数据 数组 存储 为什么      更新时间:2023-10-16

我正在尝试为我的作业编写C++代码。

发生的事情是我必须接受来自 main 的一些数据的部分之一,在我的函数中,我必须获取由 main 发送的数组的第一部分并放入函数中的数组中。

        for (int i = 0; i <= strlen(main) && exit == 0; i++){
        if (main[i] != ';' || main[i] != ''){
        keyword[i] = data[i];
        if(main[i] == ';' || main[i] == '')
        exit = 1;
        }

这是名为 main = "Hello World;Yes;No;Okay;Good Bye", 的数组中的代码

所以发生的情况是我想将该Hello World存储在名为 keyword 的数组中,问题是一旦我打印关键字字符串,我就会在单词 Hello World 之后看到额外的数据

这是我在打印件上的内容

Your keyword-----> 'Hello World;? ' Actual keyword---> 'Hello World'

我上面的逻辑使用有什么问题吗?

谢谢

i <= strlen(main)需要i < strlen(main),并且不需要在if中进行额外的终止字符检查。还要确保keyword在复制必要的数据后以空终止((。

只是为了让您知道,假设目的地足够大以容纳正在复制的数据。

for (int i = 0; i < strlen(main) ; i++)
    if (main[i] != ';'){
        keyword[i] = data[i];  // Copy the characters until `;` isn't found
    } else {
        keyword[i] = '' ;   // If `;` found, null terminate the copied destination.
        break;
    }
}

条件

if (main[i] != ';' || main[i] != '')

总是为真,你想测试字符是否既不是';"也不是'\0',所以需要将测试与&&运算符(and(连接,而不是||(or(。

一些注意事项:

  1. strlen函数具有 O(N( 复杂性,最好在循环之前调用它一次以确定字符串的长度或用 *main[i] 替换测试。

  2. exit变量是多余的,请使用break

您看到的额外数据可能是空终止字符。请注意,您正在使用

i <= strlen(main)

因此,这实际上打印了所有字符加上空终止。您应该将其更改为

i < strlen(main)

通常,为了更好地理解您的工作,更多的代码确实会有所帮助。

但正如 begemoth 所说,对于你想要做的 if(( 测试,似乎应该是:

 if(main[i] != ';' && main[i] != '')