Вопрос о нуле против нуля - PullRequest
3 голосов
/ 27 марта 2010

У меня есть эта функция:

void ToUpper(char * S)
{
    while (*S!=0)
    {
       *S=(*S >= 'a' && *S <= 'z')?(*S-'a'+'A'):*S;
       S++;
    }
} 

Что это значит для * S! = 0, должно ли оно быть нулевым?

Ответы [ 5 ]

9 голосов
/ 27 марта 2010

Это проверка конца строки, которая является символом со значением ноль. Он никак не связан с указателями NULL.

4 голосов
/ 27 марта 2010

Я бы написал это *S != '\0', так как я чувствую, что это более идиоматично, но на самом деле это просто личное предпочтение стиля. Вы проверяете наличие нулевого символа (ASCII NUL).

Вы также можете рассмотреть возможность проверки S != 0 перед любым кодом, поскольку сам указатель может быть нулевым, и вы не хотите разыменовывать нулевой указатель.

0 голосов
/ 08 декабря 2010

NULL определяется по-разному в C и C++

в C

#define NULL 0

в C++

#define NULL (void*) 0
0 голосов
/ 28 марта 2010

NULL - указатель, а * S - значение, хранящееся в указателе. Благодаря Деннису Ритчи, цифра 0 является приемлемой как для обоих.

0 голосов
/ 28 марта 2010

Мне нравятся алгоритмы лучше, чем циклы:

#include <algorithm>
#include <cstring>
#include <cctype>

void ToUpper(char* p)
{
    std::transform(p, p + strlen(p), p, toupper);
}

Это решение также работает для кодировок символов, где от a до z не являются последовательными.

Просто для удовольствия, вот эксперимент, который выполняет только одну итерацию с алгоритмами:

#include <algorithm>
#include <cassert>
#include <cstring>
#include <cctype>
#include <iostream>
#include <iterator>

struct cstring_iterator : std::iterator<std::random_access_iterator_tag, char>
{
    char* p;

    cstring_iterator(char* p = 0) : p(p) {}

    char& operator*()
    {
        return *p;
    }

    cstring_iterator& operator++()
    {
        ++p;
        return *this;
    }

    bool operator!=(cstring_iterator that) const
    {
        assert(p);
        assert(!that.p);
        return *p != '\0';
    }
};

void ToUpper(char* p)
{
    std::transform(cstring_iterator(p), cstring_iterator(),
                   cstring_iterator(p), toupper);
}

int main()
{
    char test[] = "aloha";
    ToUpper(test);
    std::cout << test << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...