Почему в массиве хранятся лишние данные? - PullRequest
0 голосов
/ 25 февраля 2012

Я пытаюсь запрограммировать код на C ++ для моего назначения.

Что происходит, это одна из частей, где мне приходится принимать некоторые данные из моей основной и в моей функции я должен получить первую частьмассива, отправленного 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

появляются дополнительные данные*Your keyword-----> 'Hello World;? ' Actual keyword---> 'Hello World'

Есть ли проблемы с моим использованием логики выше ??

Спасибо

Ответы [ 3 ]

2 голосов
/ 25 февраля 2012

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 голос
/ 25 февраля 2012

Условие

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

всегда истинно, вы хотите проверить, является ли символ ни ';'ни '\ 0', поэтому необходимо подключить тест с оператором && (and), а не || (or).

Некоторые примечания:

  1. функция strlen имеет сложность O (N), лучше вызвать ее один раз перед циклом, чтобы определить длину строки, или заменить тест на *main[i].

  2. Переменная exit является избыточной, используйте break.

1 голос
/ 25 февраля 2012

Дополнительные данные, которые вы видите, являются, вероятно, нулевым символом завершения. Обратите внимание, что вы используете

i <= strlen(main)

Таким образом, это на самом деле печатает все символы плюс нулевое завершение. Вы должны изменить его на

i < strlen(main)

Обычно, чтобы лучше понять, что вы делаете, немного полезного кода было бы действительно полезно.

Но, как сказал Бегемот, для того, что вы хотите сделать, ваш тест if () должен быть:

 if(main[i] != ';' && main[i] != '\0')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...