2017-01-27 5 views
0

長すぎる:アレイは、私が含まれるコードで文字列をコピー(およびそのコンテンツを大文字にする)しようとしている

char* foo(char* word) 
{ 
    int wordLength = strlen(word); 
    char* result = (char*)malloc(wordLength * sizeof(char)); 
    for (int i = 0; i < wordLength; ++i) 
     result[i] = toupper(word[i]); 
    return result; 
} 

変数wordLength正しい数(wordの文字の正確な数)が含まれ、 result文字列がword文字列より長く、末尾に追加の文字がほとんどない(約4文字)。

答えて

4

コピーを終了できません。

C文字列は文字の配列は、数値と文字で終端されていることに注意してください0

修正コード:

char * foo(const char *word) 
{ 
    const size_t len = strlen(word); 
    char *result = malloc(len + 1); 
    char *put = result; 
    while(len--) 
    *put++ = toupper(*word++); 
    *put = '\0'; /* This was missing! */ 
    return result; 
} 

これはまた、文字列の長さを処理するために適切なsize_tタイプを使用し、簡素化メモリの割り当て。 sizeof (char)(それは常に1)でスケールする必要はなく、結果の型をキャストする必要もありません。

+0

です。ありがとうございました。 – leggo

+0

この回答で問題が解決した場合は、左側のチェックをクリックして問題を解決できます。 – Useless

+0

しかし、私はこの答えを投稿してから特定の時間の後にしかこれを行うことができません:) – leggo

0

終了ゼロのスペースを予約し、ソース文字列から宛先配列にコピーする必要があります。また、関数内でソース文字列が変更されていないので、修飾子constで宣言する必要があります。

機能は、同じタスクを行いPOSIX機能strdupがあることを考慮してください、次のよう

char* foo(const char* word) 
{ 
    char* result = (char*)malloc(strlen(word) + 1); 

    return strcpy(result, word); 
} 

を見ることができます。あなたはその後、関数は次のよう

char* foo(const char *word) 
{ 
    char* result = (char*)malloc(strlen(word) + 1); 

    char *p = result; 

    do 
    { 
     *p++ = toupper((unsigned char)*word); 
    } while (*word++); 

    return result; 
} 

や機能を見ることができます大文字に変換する必要があり、文字列のコピーと一緒に

の場合は、ループの代わりに、DO-whileループしながら使用して書き込むことができます。例えば、ここで

char* foo(const char *word) 
{ 
    char* result = (char*)malloc(strlen(word) + 1); 

    char *p = result; 

    while ((*p++ = toupper((unsigned char)*word++))); 

    return result; 
} 

は実証プログラム

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <ctype.h> 

char* foo(const char *word) 
{ 
    char* result = (char*)malloc(strlen(word) + 1); 

    char *p = result; 

    while ((*p++ = toupper((unsigned char)*word++))); 

    return result; 
} 

int main(void) 
{ 
    char *s = foo("hello world"); 

    puts(s); 

    free(s); 

    return 0; 
} 

その出力が問題だった

HELLO WORLD 
+1

これは完全に文字列を大文字にすることができません。 'strlen()'を呼び出す手間があったら、 'memcpy()'を使ってコピーする方が良いでしょう。 :) – unwind

+0

@unwindああ<文字列を大文字に変換するのを見ていない。 –

+0

キャストは必要ありません –

関連する問題