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

时间:2012-02-25 06:25:05

标签: c++ arrays function

我正在尝试使用C ++编写代码来完成我的任务。

我必须接受来自main和我的函数的一些数据的部分之一,我必须得到main发送的数组的第一部分并放入函数中的数组中。

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

        keyword[i] = data[i];
        if(main[i] == ';' || main[i] == '\0')
        exit = 1;

        }

这是名为main = "Hello World;Yes;No;Okay;Good Bye",

的数组中的代码

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

这是我在printf上的内容

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

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

由于

3 个答案:

答案 0 :(得分:2)

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

只是为了让你明白,假设目的地足够大,可以保存正在复制的数据。

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] = '\0' ;   // If `;` found, null terminate the copied destination.
        break;
    }
}

答案 1 :(得分:1)

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

i <= strlen(main)

所以这实际上打印了所有字符加上空终止。你应该把它改成

i < strlen(main)

一般来说,为了更好地理解你的工作,更多的代码真的会有所帮助。

但正如begemoth所说,看来你想做什么你的if()测试应该是:

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

答案 2 :(得分:1)

条件

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

总是如此,你想测试这个角色是不是';'也不是'\ 0',因此需要将测试与&&运算符(and)而不是||or)连接起来。

一些注意事项:

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

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