Представление строки C в памяти и сравнение
У меня есть такой код:
char str1[100] = "Hel0lo";
char *p;
for (p = str1; *p != 0; p++) {
cout << *p << endl;
/* skip along till the end */
}
и есть некоторые части, неясные для меня. Я понимаю, что строка с нулевым символом в памяти является байтом со всеми битами, равными 0 (ASCII). Поэтому, когда *p != 0
мы решили, что нашли конец строки. Если я хотел бы искать до нуля символ, я должен сравнить с 48, который DEC
представление 0 в соответствии с ASCII в памяти.
Но почему при доступе к памяти мы используем HEX
цифры и для сравнения мы используем DEC
номера?
Можно ли сравнить "\0"
как конец строки? Как то так (не работает):
for (p = str1; *p != "\0"; p++) {
И как я понимаю "\48"
равно 0
?
2 ответа
Ваш цикл включает в себя тест выхода
*p != "\0"
Это принимает значение char
p
, способствует этому int
затем сравнивает это с адресом строкового литерала "\0"
, Я думаю, что вы хотели сравнить с нулевым персонажем '\0'
вместо
*p != '\0'
Что касается сравнения с шестнадцатеричными, десятичными или восьмеричными значениями - не существует установленных правил, вы можете использовать их взаимозаменяемо, но следует стараться использовать то, что, по-видимому, делает ваш код более простым для чтения. Люди часто используют hex вместе с побитовыми операциями или при обработке двоичных данных. Помните, однако, что '0'
идентично 48
, x30
а также '\060'
но отличается от '\0'
,
Да, вы можете сравнить конец строки как:
for (p = str1; *p != '\0'; p++) {
// your code
}
ASCII значение \0
символ 0 (ноль)
Вы могли бы просто сделать
for (p = str1; *p ; p++) {
// your code
}
Как @Whozraig также прокомментировал, потому что *p
является \0
и значение ASCII 0
это ложь