0
votes

Comment puis-je accéder à la mémoire?

J'ai fait une méthode qui a changé une petite lettre à la lettre majuscule. Par exemple, lorsque j'entraîne 'i Love C langage' dans la méthode, elle génère "j'adore C langage".

Enfin, j'ai fabriqué une méthode entière, mais cela avait une erreur. Je ne connais pas la raison pour laquelle il ne pouvait pas fonctionner ... Aidez-moi ..! P>

Je construis déjà ce code dans Visual Studio 2019. P>

#include <stdio.h>

void LetterCapitalizer(char* str)
{
    const int convertCapital = 32;
    const char emptySpace = ' ';

    str[0] = str[0] + convertCapital;

    for (int i = 0; str[i] != '\0'; ++i)
    {
        if(i == emptySpace)
            str[i+1] = str[i+1] + convertCapital;
    }

    printf("%s", str);
}

int main(void)
{
    LetterCapitalizer("i am a boy");

    return 0;
}


4 commentaires

Si vous frappez un espace, vous allez convertir le caractère suivant . Ensuite, la boucle passe au caractère suivant et la convertit à nouveau. Ce n'est probablement pas ce que vous voulez.


"Je suis un garçon" est un littéral string et il est "en lecture seule". Essayez Char TMP [] = "Je suis un garçon"; Lettercapitalizer (TMP); parce que le contenu de tmp peut être modifié


Je veux changer de paramètre, mais je ne peux pas. Je ne peux que utiliser Char * Str en paramètre.


Un problème est que vous ne savez pas comment utiliser un débogueur. Au lieu de deviner ou de demander si, apprenez à utiliser l'excellent débogueur intégré à Visual Studio. Essayez ceci: Démarrez votre programme avec la touche F11 (étape dans). Ensuite, utilisez F10 (étape) pour parcourir votre programme. Il affichera vos valeurs variables à chaque étape. Continuez à marcher et à regarder et vous trouverez au moins certains de vos bugs tout de suite.


3 Réponses :


1
votes

Deux petites choses pour améliorer votre programme:
Tout d'abord, comme @PMG a dit, remplacez le LetterCapitalizer ("Je suis un garçon"); par xxx

Cela vous permettra de ne pas écrire dans un Lecture seule String littermal.

Deuxièmement, si votre chaîne contient un espace , vous convertiez le prochain caracter . .. Dans ce cas, vous pouvez simplement ignorer l'itération actuelle et aller au suivant.
Enfin, si vous n'avez aucune restriction sur les fonctions C appellent, il existe une fonction Toupper () qui prend un véhicule et la convertit en majuscule!


0 commentaires

2
votes

Cette méthode avec convertcapital code> n'est pas portable, par exemple, il n'a pas fonctionné sur ma machine (je devais soustraire 32, pas ajouter 32). Utilisez TOUPPER code> à la place:

void LetterCapitalizer(char* str)
{
    const char emptySpace = ' ';
    putchar(toupper(str[0]));

    for (int i = 1; str[i] != '\0'; ++i)
    {
        putchar(str[i]);
        if (str[i] == emptySpace) {
            putchar(toupper(str[i + 1]));
            i++;
        }   
    }
}


3 commentaires

Dans votre exemple, il donne une faute de segmentation lorsque vous libérez la variable «Strcopy» avant de l'imprimer ...


J'évite généralement l'allocation à l'intérieur d'une fonction qui renvoie vide car il n'y a généralement aucun moyen d'obtenir une erreur (si le malloc () échoue) sans casser le programme.


@Johnszakmeister bon point. J'ai posté une version sans allocation de mémoire supplémentaire pour montrer comment cela pourrait ressembler.



0
votes

Vous pouvez utiliser un drapeau pour indiquer que le prochain caractère sans espace doit être capitalisé. Vous pouvez stocker la chaîne de résultat dans une autre chaîne. puis renvoyez cette chaîne de résultat. J'ai corrigé le code. S'il vous plaît voter si cela vous a aidé. xxx


2 commentaires

Vous devez importer pour bool et string.h for strallen () fonction


De plus, vous devez soustraire 32 car dans ASCII, les lettres captiales arrivent avant que leur code ASCII est de 32 lettres. Vous pouvez voir la table complète ASCII ici