2016-05-22 25 views
-3

Ich versuche, in C-Programmierung zu bekommen, und ich habe Probleme mit dem Zuweisen und Ziehen von Daten aus C-Arrays (in diesem Fall zu und von C-Stil-Strings).Problem C-Grundlagen verstehen

Bitte weisen Sie auf Fehler hin, die Sie hier sehen.

Ich bin in erster Linie ein C++/Python-Programmierer, also bitte halten Sie die Erläuterungen zur Speichernutzung und -verwaltung so einfach wie möglich.

#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; 
}; 

Kompilieren dieses Codes mit gcc goof.c -o goof -std=c11 Ergebnisse in:

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) { 
    ^

und der Code ausgeführt wird bewirkt, dass bash sagen:

Segmentation fault (core dumped) 
+0

In einem wichtigen inlcude: '# include '. Lesen Sie das Dokument für 'printf'. Es arbeitet mit Formatzeichenfolgen, z.B. Der Ausdruck einer Zahl erfolgt folgendermaßen: 'printf (" Wert:% d \ n ", val);'. Es gibt Formate zum Patchen in String-Argumenten, einzelnen Zeichen, Zahlen, ... –

+0

'int size = sizeof (von)/sizeof (char);' wird mit Funktionsargumenten nicht funktionieren. Die erste 'sizeof' gibt die Größe des Zeigers an, was die Funktion nur von' from' kennt. –

+5

Ihre Verwendung von 'printf' ist insgesamt falsch, bitte RTM. –

Antwort

5

dort ist viele Fehler drin und kein Array, nur structs.

  • erste, müssen Sie die stdlib Bibliothek (#include <stdlib.h>)
  • zweitens sind, kann die Funktion printf nicht so verwendet werden. Diese Funktion benötigt eine Zeichenfolge, um zu wissen, wie die Daten zu drucken sind: printf("an int: %d",myInt); oder printf("a string: %s",myString);. Beachten Sie die% d oder% s, die angeben, wo die Daten abgelegt werden sollen.
  • drittens glaube ich dir void assign_str(const char* from, char** to) wollen