Могу ли я таким же образом использовать char * c и строки? - PullRequest
0 голосов
/ 18 июня 2020

В чем разница между char* c и char *c? Что не так в этом коде?

#include<iostream>
#define num 2
using namespace std;
int main (){
    char *c="HelloWorld!!!";
    cout<<*(c+num);
    return 0;
}

Ответы [ 4 ]

1 голос
/ 18 июня 2020

в C ++ строковый литерал реализуется с помощью const char *. Кроме того, компилятор не будет различать guish

char* c;

и

char *c;

, поскольку они имеют одинаковое значение (указатель на char)

0 голосов
/ 18 июня 2020

Нет разницы между char* и char *, но есть разница между char& и char*, поэтому, пожалуйста, отредактируйте свой вопрос и будьте более конкретными c, скажите, что вы ожидаете, потому что ваш код делает то, что вы написали, поэтому я не знаю, нужно ли объединить массив символов с 2. Если это так, то я предлагаю вам использовать <string>, в этой библиотеке вы можете использовать оператор + () для конкатенации ссылка .

В вашем коде вы делаете следующее: вы создаете массив, а затем печатаете что-то по адресу c + 2. Это 'l'. Когда я бегу, я получаю это. Как кто-то сказал раньше, вы должны быть осторожны, потому что const char* не может использоваться для инициализации char *, reference .

Если вы действительно хотите изменить эту строку, вы можете сделать что-то вроде этого:

 #include<iostream>
 #include <stdlib.h>

 #define num 2

using namespace std;
int main() {
    const char* c = "HelloWorld!!!";
    char* str;
    int n = 0;
    while (true)
    {
        if (c[n++] == '\0') // '\0' is character for terminating string
        {
            break;
        }

    }
    str = (char*)calloc(n + 1, sizeof(char));
    for (int i = 0; i <= n; i++)
    {
        if (i < n - 1)
        {
            str[i] = c[i];
        }
        else
        {
            if (i == n - 1)
            {
                str[i] = (char)('0' + num);// with this sum you wil get ascii code of '2' and write it in str + n - 1
            }
            else
            {
                str[i] = '\0';
            }
        }
    }
    cout << str;

    //cout << *(c + num);
    return 0;
}

Есть разница между string и char*. В C / C ++ у вас может быть только массив символов. Вы можете выполнить любую простую операцию с char, как и с int. Но вы не можете выполнять операцию непосредственно с массивом, если не вызываете свою собственную функцию. По этой причине вы должны использовать библиотеки для выполнения таких операций, как конкатенация, сравнение строк или что-то еще. Если вы предпочитаете работать напрямую с char*, вам следует использовать <string.h>, но если вы хотите быть более удобным, вы можете использовать <string> и создать строку как объект.

0 голосов
/ 18 июня 2020

Если вы скомпилируете свою программу с включенным флагом -Wall, вы увидите следующее сообщение об ошибке:

warning: ISO C++11 does not allow conversion from string literal
      to 'char *' [-Wwritable-strings]
    char *c="HelloWorld!!!";

вы должны сделать переменную c a const char *, чтобы предупреждение исчезнет, ​​поскольку строковый литерал реализован как такой тип, в отличие от C, где char* было бы достаточно.

Примечание: вы можете просто использовать ключевое слово auto и позволить компилятору найти правильный тип :

auto c = "HelloWorld!!!"
0 голосов
/ 18 июня 2020

Абсолютно никакой разницы между char* c и char *c проблема с вашим кодом в том, что "HelloWorld" является const char *, поэтому вам нужно либо преобразовать его в char *, либо сохранить в переменной const char. . Также я бы не стал определять этот макрос, просто сохраните это число в переменной (переменная constexpr, если вы хотите оценить время компиляции), его намного легче читать

#include<iostream>
using namespace std;
int main() {
    constexpr int num = 2;
    char* c = (char*)"HelloWorld!!!";
    const char* c2 = "HelloWorld!!!";
    cout << *(c + num);
    return 0;
}
...