Представление строки 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"

Это принимает значение charp, способствует этому 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 это ложь

Другие вопросы по тегам