2017-12-13 5 views
-3

これは私がこれまで持っていたものです。私はこの機能を実装する方法を理解しようとしています。Cではアルファ文字をn文字列を大文字に変換しますか?

char toupper(char s[]) 
{ 
    s[50] = "hello"; 
    int i = 0; 
    int len; 
    len = strlen(s); 

    while(i < len) //converting to upper until the length is reached. 
    { 
    s[i] = putchar(toupper(s[i])); 
    i++; 
    } 
    return s[i]; 
} 
+1

Pardon?理解していない。あなたは何を求めているのか少し具体的になりますか? –

+3

関数にライブラリ関数と同じ名前を付けることはお勧めできません。 – interjay

+3

なぜあなたは関数内に 's [50] =" hello ";'を持っていますか?これは関数に渡されているものをオーバーライドします。 –

答えて

2

OPは文字列を大文字に変換したいようです。さて、ここで何とかOPが割り当て部分を台無しにしました。渡された文字列にuppercase文字を代入することで、コードを書き直すことができます。

しかし、ここでは、コードはコンパイラが不平を言っていることをしています。​​。私たちはcharchar*を割り当てようとしています。思考がほとんどなくてもコード全体を簡素化することができます。文字列をすべて大文字に変換するモジュールを記述します。それでおしまい。それから、 "hello"や文字列でテストします。

#include<stdio.h> 
#include<ctype.h> 
#include<string.h> 
void toupperString(char s[]) 
{ 
    size_t len = strlen(s), i = 0; 

    while(i < len) 
    { 
    s[i] = toupper((unsigned char) s[i]); 
    i++; 
    } 
} 

int main(void) { 
    char s[100]; 
    strcpy(s,"hello"); // char s[100]="hello" also works; 
    toupperString(s); 
    printf("%s\n",s); 
    return 0; 
} 

あなたのputcharの使用は正しかったです。だからこれは今も印刷に行くという追加機能で動作します。 (それが機能であるかどうかは、印刷する以外には役に立たないため、いつもに与えられたものを印刷するのは良い考えではありません)。

void toupperString(char s[]) 
{ 
    size_t len = strlen(s), i = 0; 

    while(i < len) 
    { 
    s[i] = toupper((unsigned char) putchar(s[i])); 
    i++; 
    } 
} 

あなたはこの機能でも不審な点があります。たとえば、その戻り値。 \0文字を返すのはなぜですか?それは必要ですか?答えが「いいえ」の場合、戻り値はvoidで、何も返されていないことを示します。また配列がポインタに壊れるので、char配列が変更され、それを返すために何もする必要はありません。あなたは基本的に文字の元の配列を変更しています。

まあ、我々は

char* toupperString(char *s) 
{ 
    char *p = s; 
    while(*s) 
    { 
     *s= toupper((unsigned char) *s); 
     ++s; 
    } 
    return p; 
} 
+0

@chux:このアイデアを書いた。それはBob__によって私に慰められ、それを追加した。 – coderredoc

1

としてこのように、より簡潔に書くことができますあなたの現在の機能は、すでに達成しようとしているものの基本的な前提を持っていますが、多くの問題を抱えています。

最初に、それをtoupperと呼ぶことは、既に存在するtoupper機能を使用して機能を実装していることに疑いの余地はありません。あなたの関数は文字列を受け取り、変更された文字列を返す必要がありますが、既存のtoupperは単一のcharを取得して返します。概念的には、渡された文字列を変更しているため、何も返す必要はありませんが、返すことはできません。

第2に、putcharに電話しているのは、明らかな理由がないからです。必要があれば、更新された文字列をコードの後半部分に出力することができます。

第三に、あなただけのchariが文字列の長さは、終端のヌル文字を指しられるインクリメントされていることを考えるとしているs[i]を返します。

また、偽の行s[50] = "hello";は、渡された文字列の51番目の文字をある値に設定しています。これは "hello"の文字ではありませんが、代わりに文字列 "hello"のメモリ位置。 sを "hello"と宣言しようとしている場合は、これを例として取り上げた呼び出し関数で行う必要があります。

int main(void) 
{ 
    char s[]="hello"; 
    make_string_upper(s); 
    printf("%s\n",s); 
} 

char *make_string_upper(char *s) 
{ 
    int i = 0; 
    int len = strlen(s); 

    while(i < len) //converting to upper until the length is reached. 
    { 
    s[i] = toupper(s[i]); 
    i++; 
    } 
    return s; 
} 
+1

あなたはOPのコードについて私がコメントしたいことはすでに言っていますが、 'strlen'の呼び出しを取り除くことを提案してもいいですか?私はそれが役に立たないと思う:https://ideone.com/5IlRo9 –

+0

@Bob__関数は文字列を返すので、 'strlen'を使うことはできません。 –

+0

@ChrisTurner .: Yikes申し訳ありませんChris ... Mysinterpeted – coderredoc

関連する問題