2016-05-22 3 views
-3

J'essaie d'entrer dans la programmation C, et j'ai des problèmes avec l'assignation et l'extraction de données de C-arrays, (dans ce cas, de et vers des chaînes de style C).Problème Comprendre les bases C

Veuillez indiquer les erreurs que vous voyez ici.

Je suis principalement un programmeur C++/python, veuillez donc garder les explications sur l'utilisation et la gestion de la mémoire aussi simples que possible.

#include <stdio.h> 

typedef struct AuthorInfo { 
    char* firstName; 
    char* lastName; 
} AuthorInfo; 

typedef struct BookEntry { 
    char bookID; 
    char* bookName; 
    AuthorInfo author; 
} BookEntry; 

void assign_str(const char** from, char** to) { 
    int size = sizeof(from)/sizeof(char); 
    printf((char)size); 
    printf('\n'); 
    for (int i=0; i < size; i++) { 
    (*to)[i] = (*from)[i]; 
    }; 
}; 

BookEntry BookEntry_(const int id, const char* bName, const char* aF, const char*aL, BookEntry* ret) { 
    ret->bookID = id; 
    ret->bookName = (char*)malloc(sizeof(bName)); 
    ret->author.firstName = (char*)malloc(sizeof(aF)); 
    ret->author.lastName = (char*)malloc(sizeof(aL)); 
    assign_str(bName, &ret->bookName); 
    assign_str(aF, &ret->author.firstName); 
    assign_str(aL, &ret->author.lastName); 
} 

void display_book(BookEntry* entry) { 
    printf(entry->bookName); 
    printf('\n'); 
    printf(entry->author.firstName); 
    printf(' '); 
    printf(entry->author.lastName); 
    printf('\n'); 
}; 

int main(int argc, char** args) { 
    BookEntry book; 
    book.bookID = 0; 
    assign_str("Tom Sawyer", &book.bookName); 
    assign_str("Mark", &book.author.firstName); 
    assign_str("Twain", &book.author.lastName); 
    display_book(&book); 
    return 0; 
}; 

Compiler ce code avec gcc goof.c -o goof -std=c11 résultats dans:

goof.c: In function ‘assign_str’: 
goof.c:16:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion] 
    printf((char)size); 
     ^
In file included from goof.c:1:0: 
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘char’ 
extern int printf (const char *__restrict __format, ...); 
      ^
goof.c:16:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf((char)size); 
^
goof.c:17:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion] 
    printf('\n'); 
     ^
In file included from goof.c:1:0: 
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘int’ 
extern int printf (const char *__restrict __format, ...); 
      ^
goof.c:17:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf('\n'); 
^
goof.c: In function ‘BookEntry_’: 
goof.c:25:26: warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration] 
    ret->bookName = (char*)malloc(sizeof(bName)); 
         ^
goof.c:25:26: warning: incompatible implicit declaration of built-in function ‘malloc’ 
goof.c:25:26: note: include ‘<stdlib.h>’ or provide a declaration of ‘malloc’ 
goof.c:28:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str(bName, &ret->bookName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘const char *’ 
void assign_str(const char** from, char** to) { 
    ^
goof.c:29:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str(aF, &ret->author.firstName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘const char *’ 
void assign_str(const char** from, char** to) { 
    ^
goof.c:30:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str(aL, &ret->author.lastName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘const char *’ 
void assign_str(const char** from, char** to) { 
    ^
goof.c: In function ‘display_book’: 
goof.c:34:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf(entry->bookName); 
^
goof.c:35:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion] 
    printf('\n'); 
     ^
In file included from goof.c:1:0: 
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘int’ 
extern int printf (const char *__restrict __format, ...); 
      ^
goof.c:35:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf('\n'); 
^
goof.c:36:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf(entry->author.firstName); 
^
goof.c:37:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion] 
    printf(' '); 
     ^
In file included from goof.c:1:0: 
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘int’ 
extern int printf (const char *__restrict __format, ...); 
      ^
goof.c:37:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf(' '); 
^
goof.c:38:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf(entry->author.lastName); 
^
goof.c:39:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion] 
    printf('\n'); 
     ^
In file included from goof.c:1:0: 
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘int’ 
extern int printf (const char *__restrict __format, ...); 
      ^
goof.c:39:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf('\n'); 
^
goof.c: In function ‘main’: 
goof.c:45:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str("Tom Sawyer", &book.bookName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘char *’ 
void assign_str(const char** from, char** to) { 
    ^
goof.c:46:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str("Mark", &book.author.firstName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘char *’ 
void assign_str(const char** from, char** to) { 
    ^
goof.c:47:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str("Twain", &book.author.lastName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘char *’ 
void assign_str(const char** from, char** to) { 
    ^

Et l'exécution du code provoque bash dire:

Segmentation fault (core dumped) 
+0

Ajouter une inlcude importante: '' #include . Assurez-vous de lire le document pour 'printf'. Cela fonctionne avec des chaînes de format, par ex. l'impression d'un nombre s'effectue de la façon suivante: 'printf (" Valeur:% d \ n ", val); Il ya des formats à patcher dans les arguments de chaîne, les caractères simples, les nombres, ... –

+0

'int size = sizeof (from)/sizeof (char);' ne fera pas ce que vous voulez avec les arguments de fonction. Le premier 'sizeof' donnera la taille du pointeur qui est la seule chose que la fonction sait à propos de' from'. –

+5

Votre utilisation de 'printf' est tout à fait fausse, s'il vous plaît RTM. –

Répondre

5

Il y a beaucoup d'erreurs là-bas et aucun tableau, seulement struct.

  • d'abord, vous devez inclure la bibliothèque stdlib (#include <stdlib.h>)
  • d'autre part, la fonction printf ne peut pas être utilisé comme ça. Cette fonction nécessite une chaîne pour savoir comment imprimer les données ex: printf("an int: %d",myInt); ou printf("a string: %s",myString);. Notez le% d ou% s ils indiquent où placer les données.
  • En troisième lieu, je pense que vous voulez que cette void assign_str(const char* from, char** to)