2016-06-26 5 views
1

char配列で動作している問題が発生しています。 私の考えはchar配列に入力を格納し、その配列の内容をstructの内部に格納するためにscanfを使用することでした。ここで文字配列の目的コードC

はあなたが理解しやすいかもしれコードです:

struct ListaCategoria { 
    int ident; 
    char data[MAX]; 
    struct ListaCategoria* next; 
}; 

struct ListaCategoria* headCat; 

void inserirCat(){ 
    int x; 
    char arr[MAX]; 
    printf("Identificacao : "); 
    scanf("%d", &x); 
    printf("Designacao : "); 
    scanf("%c[^\n]", &arr); 
    struct ListaCategoria* temp = (struct ListaCategoria*) malloc(sizeof(struct ListaCategoria)); 

    (*temp).ident = x; 
    (*temp).data = arr; //this is the line that's giving some trouble can someone explain me why? 
} 
+0

'scanf("%c [^ \ n] "、&arr);'は 'char * 'が必要なところで' char(*)[MAX] 'が渡されるため、*未定義の動作*を呼び出します) – MikeCAT

+0

「目的C」によってiOSアプリケーションを開発するために一般的に使用される言語ですか? – MikeCAT

+0

'temp-> data'と' temp-> ident'は短くなります –

答えて

1

%cは正確に一つのcharだけのためであるC-「文字列」%sを使用し、にデータをスキャンするには。

また、配列をスキャンする場合は、配列を渡します。この配列を渡すと、最初の要素のアドレスに崩壊します。その要素のアドレス演算子を使用する必要はありません。あなたがしようとしている

(*temp).data = arr; 

このラインで

scanf("%41s[^\n]", arr); /* specify one less, as C-"string" always carry 
          and additional char, the so called `0`-terminator 
          marking the end of the string. */ 

scanf("%s[^\n]", arr); 

また、あなたは(#define MAX (42)と仮定して)、そのサイズを指定することで、渡されたバッファをオーバーフローしないようにscanf()を教えてください配列を配列に代入する。これは、他のアプローチが取られる必要がある配列の内容をコピーするために一般的にC.

では不可能である。

  • ループと別々
  • の各要素の値を割り当てるために、ソースメモリの内容をコピーします後者の場合と

    • ボットもし宛先メモリ

    すべての

    strcpy((*temp).data, arr); 
    

    この関数ではないコピー:H配列はchar -arrays

  • 源アレイは、最も一般的なアプローチは、機能strcpy()を使用することであるC-「ストリング」

であります配列の内容ではなく、使用されている部分、すなわち0 -terminatorまで、検出された文字列の最後をマークします。