Konvertieren von char * in Großbuchstaben in C

Lesezeit: 4 Minuten

Benutzeravatar von EDEDE
EDEDE

Ich versuche, a umzuwandeln char * Großbuchstaben in c, aber die Funktion toupper() geht hier nicht.

Ich versuche, den Namen des Werts von temp zu erhalten, wobei der Name irgendetwas vor dem Doppelpunkt ist, in diesem Fall “Test”, und dann möchte ich den Namen vollständig groß schreiben.

void func(char * temp) {
 // where temp is a char * containing the string "Test:Case1"
 char * name;

 name = strtok(temp,":");

 //convert it to uppercase

 name = toupper(name); //error here
 
}

Ich erhalte den Fehler, dass die Funktion toupper() erwartet ein interhält aber a char *. Die Sache ist, ich muss verwenden char *s, da die Funktion dies übernimmt (ich kann es nicht wirklich verwenden char Arrays hier, kann ich?).

Jede Hilfe wäre sehr willkommen.

chux – Stellt Monicas Benutzeravatar wieder her
Chux – Wiedereinsetzung von Monica

toupper() konvertiert eine einzelne char.

Verwenden Sie einfach eine Schleife:

void func(char * temp) {
  char * name;
  name = strtok(temp,":");

  // Convert to upper case
  char *s = name;
  while (*s) {
    *s = toupper((unsigned char) *s);
    s++;
  }

}

Detail: Die Standardbibliotheksfunktion toupper(int) ist für alle definiert unsigned char und EOF. Seit char kann signiert werden, umwandeln in unsigned char.

Einige Betriebssysteme unterstützen einen Funktionsaufruf, der dies tut: upstr() und strupr()

  • Welche Systeme normalerweise unterstützen upstr? Das Debian-Manpage zum upstr sagt, dass es vom “Alliance CAD System” stammt.

    – falscher Vater

    22. September 2019 um 6:00 Uhr


Für diejenigen unter Ihnen, die eine Zeichenfolge groß schreiben möchten und speichere es in einer Variablen (das war es, wonach ich gesucht habe, als ich diese Antworten gelesen habe).

#include <stdio.h>  //<-- You need this to use printf.
#include <string.h>  //<-- You need this to use string and strlen() function.
#include <ctype.h>  //<-- You need this to use toupper() function.

int main(void)
{
    string s = "I want to cast this";  //<-- Or you can ask to the user for a string.

    unsigned long int s_len = strlen(s); //<-- getting the length of 's'.  

    //Defining an array of the same length as 's' to, temporarily, store the case change.
    char s_up[s_len]; 

    // Iterate over the source string (i.e. s) and cast the case changing.
    for (int a = 0; a < s_len; a++)
    {
        // Storing the change: Use the temp array while casting to uppercase.  
        s_up[a] = toupper(s[a]); 
    }

    // Assign the new array to your first variable name if you want to use the same as at the beginning
    s = s_up;

    printf("%s \n", s_up);  //<-- If you want to see the change made.
}

Notiz: Wenn Sie stattdessen eine Zeichenfolge klein schreiben möchten, ändern Sie toupper(s[a]) zu tolower(s[a]).

  • Neugierig, warum Typ verwenden unsigned long int s_len vs. unsigned s_len oder noch besser size_t s_len? Scheint seltsam zu verwenden unsigned long s_len und int a in a < s_len. Ich würde erwarten, dass die Variablen vom gleichen Typ sind.

    – chux – Wiedereinsetzung von Monica

    4. Juni 2019 um 14:18 Uhr

  • Ehrlich gesagt bin ich neu in C und Programmieren im Allgemeinen, daher ist es ziemlich wahrscheinlich, dass die Variablentypen nicht die besten sind.

    – Mike

    11. Juni 2019 um 20:55 Uhr

toupper() funktioniert nur mit einem einzigen Charakter. Aber da ist strupr() was Sie für einen Zeiger auf eine Zeichenfolge wollen.

  • strupr ist nicht genormt. Soweit ich weiß, wird es nur von der Microsoft-Bibliothek unterstützt.

    – zwischenjay

    3. Februar 2016 um 16:10 Uhr

  • @interjay: es wird auch von Greenhills und Borland unterstützt. Aber du hast Recht, es ist nicht in glibc.

    – Wallyk

    3. Februar 2016 um 16:12 Uhr

Wie wäre es mit dieser kleinen Funktion? Es geht von ASCII-dargestellten Zeichen aus und ändert die Zeichenfolge an Ort und Stelle.

void to_upper(char* string)
{
    const char OFFSET = 'a' - 'A';
    while (*string)
    {
        *string = (*string >= 'a' && *string <= 'z') ? *string -= OFFSET : *string;
        string++;
    }
}

toupper() arbeitet an einem Element (int Argument, Wertbereich der gleiche wie von unsigned char oder EOF) gleichzeitig.

Prototyp:

int toupper(int c);

Sie müssen eine Schleife verwenden, um jeweils ein Element von Ihrem zu liefern Schnur.

  • Vielleicht werde ich diese Antwort löschen, da sie keinen Mehrwert bringt, aber was ist der Grund für DV?

    – Sourav Ghosh

    4. Februar 2016 um 15:49 Uhr

  • Vielleicht werde ich diese Antwort löschen, da sie keinen Mehrwert bringt, aber was ist der Grund für DV?

    – Sourav Ghosh

    4. Februar 2016 um 15:49 Uhr

1433200cookie-checkKonvertieren von char * in Großbuchstaben in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy