0
votes

Puis-je utiliser Char * C et Strings de la même manière?

Quelle est la différence entre char * c et char * c ? Quel est le problème dans ce code? XXX


9 commentaires

Votre compilateur aurait dû vous demander d'ajouter un const à la déclaration de C .


Que voulez-vous dire & char * c ?


Quel est le problème dans ce code? à côté du manquant const , il n'y a rien de mal avec le code. Il génère l ( démo sur Coliru ) qui est le Troisième lettre dans "helloworld !!!" (c.-à-d. Le caractère à C + 2 ). Qu'est-ce que vous attendiez?


Si vous souhaitez imprimer la chaîne littéral des troisième lettres jusqu'à la fin, vous devez supprimer le * devant C + NUM.


Comme les réponses ont noté, il n'y a pas de différence entre Char * C et Char * C - mais même si vous collez avec le premier! Le * appartient à la variable, pas le type. Par exemple, si vous avez char * c, d, e , alors seul C est le char * .... d et e sont de Char seulement.


Est-ce que cela répond à votre question? Déclaration des pointeurs; Astérisque à gauche ou à droite de l'espace entre le type et le nom?


@RACRAMAN C'est comme des espaces vs. onglets. Les deux formats ont leur validité. Je dirais que le type est char * , car c'est la manière dont le compilateur le voit, pas char qui se trouve être un pointeur. Quelle que soit la forme que vous préférez, il est préférable d'être cohérent à ce sujet et d'utiliser toujours la même approche. Déclarer plusieurs variables à la fois demander des problèmes, comme vous le souhaitez.


Conseil: vous voulez presque toujours dire c [num] au lieu de * (c + num) .


@tadman Le point est que le compilateur associe le * avec la variable, c'est pourquoi d et E ne sont que char (et bien sûr que WhitSpace est ignoré, c'est pourquoi Char * C et char * c sont acceptés). Les styles de codage doivent suivre ce que le compilateur fait, sinon les gens peuvent être mordus par d et E ne pas être ce qu'ils pensent.


4 Réponses :


1
votes

en C ++, la chaîne littéral est mise en œuvre par Cons-Char *. De plus, le compilateur ne distinguera pas xxx pré>

et p>

char *c;


0 commentaires

0
votes

Il n'y a absolument pas de différence entre char * c code> et char * c code> Le problème avec votre code est que "helloworld" est un const Char * afin que vous ayez à jetez-le à un char * ou rangez-le dans une variable Cons-Char. De plus, je ne définirais pas cette macro, stockez simplement ce numéro dans une variable (Constexpr variable si vous souhaitez une évaluation de l'heure de compilation) Il est beaucoup plus facile de lire

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


4 commentaires

; est manquant dans int Num = 2.


Techniquement "helloworld !!!" est un const char [14] , pas un const char * , bien qu'il puisse être converti implicitement en un const char * .


Et je suggère d'utiliser Constexpr int Num = 2; , si le #define a été placé intentionnellement pour signifier constante d'évaluation de la compilée.


numéro devrait être dans une variable de consexpr.



0
votes

Si vous compilez votre programme avec le drapeau -wall code> activé, vous verrez le message d'erreur suivant:

auto c = "HelloWorld!!!"


0 commentaires

0
votes

Il n'y a pas de différence entre char * code> et char * code>, mais il y a la différence entre char et code> et char * code >, s'il vous plaît, veuillez éditer votre question et être plus précis, dites ce que vous attendez-vous, car votre code fait ce que vous avez écrit, alors je ne sais pas si vous souhaitez peut-être concaténer une gamme de caractères avec 2. S'il s'agit de la Cas, que je vous suggérerai d'utiliser code>, dans cette bibliothèque, vous pouvez utiliser l'opérateur + () pour la concaténation Référence .

Ce que vous faites dans votre code est le suivant: vous créez une matrice, puis vous imprimez quelque chose sur l'adresse C + 2. C'est« L ». Quand je cours, je reçois ça. Comme quelqu'un l'a dit avant de devoir faire attention car const char * code> ne peut pas être utilisé pour initialiser le char *, référence . p>

Si vous voulez vraiment changer cette chaîne, vous pouvez faire quelque chose comme ceci: p>

 #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;
}


0 commentaires