2017-01-27 2 views
-3

私はこれまでインターネットで探していましたが、これまでのところ私は特定の答えと一般的なものについて多くの質問を見つけました。charの配列を返す関数としてcharを配列する単純な方法で

私はCの上にrustyです。そして、私はcharの配列を返す関数を作りたいと思います。

これは私が得たものであり、動作していないものです。

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

char *get_char(int my_byte[], int packetsize) 
{ 
    char *array_char=(char *) malloc(sizeof(char)*10); //trying this but didnt work 
    // char array_char[10]; //i had it like this before(was told to do it) 

     for(int i=0;i<10;i++) 
     { 
      array_char[i]=my_byte[i]+0; 
     }   

     return array_char; 
    } 

int main() 
{ 

    int byte_array[]={1,2,3,4,5,6,7,8,9,0}; 
    char *temp; 
    char data; 

    temp=get_char(byte_array,10); 
    data=*temp; 
    printf("String point %s ",data); 

} 
+0

数字「0」ではなく、「0」*文字*を追加します。結局、ゼロを加えると何も変わりません。つまり、 'array_char [i] = my_byte [i] + '0';'です。 –

+2

あなたは*(動的に割り当てられた) 'char'の配列を返しています。文字列 "1234567890"が含まれるようにするには、各文字を設定するときに '0'の代わりに' '0 ''を追加する必要があります。最後の要素を '0 '(または' \ 0 ')に設定して文字列の最後をマークして、11要素長(10ではなく)にします。 – Dmitri

+1

これは[this](http://ideone.com/MmSvkf)のように変更されます。 – BLUEPIXY

答えて

0

関数から配列を返すことは賢明ではありません。だから、文字列を返す方法は?ほとんどのlibc関数が使用するように、私たちはそのようなものを使用することができます(つまり、入力と一緒にバッファを渡し、出力バッファを使用して結果を得る機能を期待します)。

いくつかの問題が

  1. をコーディングしながら世話を最初にあなたのロジックを記述します。
  2. libcから利用可能な関数を使用しようとします。
  3. バイトデータ/バイナリデータを処理している間は、バッファオーバーフローを予防する必要があります。
  4. 関数内では割り当てず、別の関数では割り当てを解除しないでください。

以下は変更されたコードの例です。

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

int get_char(uint8_t my_byte[], int packetsize, char *buffer, int max_buffer) 
{ 
     int byte_itr, buf_itr; 
     char temp_buf[16]={0x00}; 
     for(byte_itr=0, buf_itr=0; byte_itr<packetsize && max_buffer > buf_itr; byte_itr++) 
     { 
       memset(temp_buf, 0x00, sizeof(temp_buf)); 
       char temp_ch = my_byte[byte_itr]; 
       snprintf(temp_buf, sizeof(temp_buf), "%d", temp_ch); 
       if(buf_itr+strlen(temp_buf) >=max_buffer){ 
         break; 
       }else{ 
         buf_itr += strlen(temp_buf); 
         strcat(buffer, temp_buf); 
         if(byte_itr+1 < packetsize){ 
           strcat(buffer, ","); 
           buf_itr += 1; 
         } 
       } 
     } 

     return buf_itr; 
} 

int main() 
{ 
     uint8_t byte_array[]={1,2,3,4,5,6,7,8,9,0}; 
     char char_array[32]={0x00}; 
     int len = get_char(byte_array, 10, char_array, sizeof(char_array)); 
     printf("String point %s : len %d\n", char_array, len); 

} 

注:その後、完全な状態をバッファ同じ出力バッファの長リターンとサイズが起こっ 。

2

二フィックス..後でatoi関数を行うには文字の配列にバイト配列に変換するための基本的な方法:

  • あなたはcharに変換したいと、その後、

array_char[i]=my_byte[i]+0;array_char[i]=my_byte[i]+'0';である必要があります。'0'は、数字0ではなく文字(intに変換されます)です(何もしません)。そのメモリを動的にget_char()機能に割り当てられているよう

  • また、あなたはmaintempポインタを解放しなければなりません。

編集:

:ちょうどバッファがNUL終端であることを確認し、あなたの get_char()

char *array_char=(char *) malloc(sizeof(char)*10); 

で別の問題がforループ後

char *array_char= malloc(sizeof(char)*(packetsize+1)); 

する必要があります注意してください

array_char[packetsize] = '\0'; 

packetsizeは決して使用されないことに注意してください。実際には、packetsizeをパラメータとして解析することが考えられますので、正しく使用してください。をmallocにハードコードするのは悪いことです。

+0

また、 'printf("ストリングポイント%s "、データ);' - > 'printf("ストリングポイント%s "、temp); ' – BLUEPIXY

+0

@BLUEPIXYはい、それは別の良いキャッチです;) – artm

+1

はあなたのコードで' array_char [packetsize] = '\ 0';をちょうど0ではなく(単にNUL文字を強調するために) – artm

1

あなたはこれらの事に注意する必要があります。

  • は、あなたがそうでなければundefined behaviourの原因となりますヒープから割り当てられ、このポインタを使用して、*array_charの終わりにヌル終端文字を追加する必要があります。
  • あなたは、単にこのような*array_charを割り当てることができます。sizeof(char)として

    char *array_char = malloc(packetsize+1); 
    

    1、およびnullbyte末尾ため+1です。

  • また、cast return of malloc()も必要ありません。

  • 代わりget_char()packetsizeとして10を渡すのでは、配列の計算されたサイズである、sizeof(arr)/sizeof(arr[0]としてこのサイズを渡す必要があります。これは、どこかで宣言された変数size_tでもかまいません。
  • malloc()を確認する必要があります。失敗した場合はNULLを返します。
  • プログラムのある時点でfree()tempが必要です。
  • array_char[i]=my_byte[i]+0;は、'0'がゼロ文字のASCIIコードであるため、代わりにarray_char[i]=my_byte[i]+'0';である必要があります。

  • char dataは、char *dataである必要があり、tempはポインタです。

    あなたは-Wall -Wextraでコンパイルする場合は、この行がわかります。

    data=*temp; 
    

    は危険であり、キャストなしで整数からポインタを作るの警告をトリガします。セグメンテーション違反が発生する可能性が最も高くなります。 tempdataは両方ともポインタである場合は、単純に使用することができます。

    tempのアドレスにdataを設定
    data=temp; 
    

    。場合によってはdata = &(*temp);と書かれていることもありますが、これは読みにくいです。彼らはdataの必要はありませんが、tempだけを使っても問題ありません。

あなたのコードは次のようになります

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

#define ARRAYSIZE(arr) (sizeof(arr)/sizeof(arr[0])) 

char *get_char(int my_byte[], size_t packetsize) { 
    char *array_char = malloc(packetsize+1); 
    const char ascii = '0'; 
    size_t i; 

    if (!array_char) { 
     printf("Cannot allocate %zu bytes\n", packetsize+1); 
     exit(EXIT_FAILURE); 
    } 

    for(i = 0; i < packetsize; i++) { 
     array_char[i] = my_byte[i] + ascii; 
    } 
    array_char[i] = '\0'; /* or array_char[packetsize] = '\0' */   

    return array_char; 
} 

int main(void) { 
    int byte_array[]={1,2,3,4,5,6,7,8,9,0}; 
    char *temp, *data; 

    temp = get_char(byte_array, ARRAYSIZE(byte_array)); 
    data = temp; 
    printf("String point %s\n", data); 

    printf("String converted into number = %d\n", atoi(data)); 

    free(temp); 
    temp = NULL; 

    return 0; 
} 

また、エラーチェックの面でatoi()を使用するよりも優れている、strtolに見ることができます。