web-dev-qa-db-ja.com

CでChar *を大文字に変換する

_char *_をcの大文字に変換しようとしていますが、関数toupper()はここでは機能しません。

Tempの値の名前を取得しようとしています。名前はコロンの前にあります。この場合は「Test」です。次に、名前を完全に大文字にします。

_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

}
_

関数toupperがintを期待しているが、char *を受け取るというエラーが発生します。それは、関数が取り込んでいるため、char *を使用する必要があるということです(ここでは、char配列を実際に使用することはできませんが、できますか?)。

どんな助けでも大歓迎です。

4
EDEDE

toupper()は、単一のcharを変換します。

単にループを使用します:

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

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

}
_

詳細:標準ライブラリ関数toupper(int)は、すべての_unsigned char_およびEOFに対して定義されています。 charは署名されている可能性があるため、_unsigned char_に変換します。

一部のOSは、これを行う関数呼び出しをサポートしています: upstr() および strupr()

toupper()は、単一の文字に対してのみ機能します。しかし、文字列へのポインタに必要なstrupr()があります。

4
wallyk

toupper() は、一度に1つの要素(int引数、_unsigned char_またはEOFと同じ範囲の値)に対して機能します。

プロトタイプ:

int toupper(int c);

ループを使用して、stringから一度に1つの要素を提供する必要があります。

2
Sourav Ghosh

変数に文字列そしてそれを格納を大文字にしたい人のために(これは私がこれらの回答を読んだときに探していたものです)。

_#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.
}
_

注:代わりに文字列を小文字にしたい場合は、toupper(s[a])tolower(s[a])に変更します。

1
Mike