C skicka "char string array" till funktion

Permalänk

C skicka "char string array" till funktion

Hej!

Roliga problem som ska vara "enkla", men har suttit hela dagen med detta och blir inte klok.

(Yupp det är klart, detta ska man inte jobba med i framtiden. )

Har kollat på många exempel och även försökt att läsa mig till hur C har hand om sina char "strängar".

Är van vid C++ och är i stort sett okänd med C sättet (vilket är bra att kunna om man vill göra något annat intressant).

Vad jag försöker göra är att mata in information i en "char string array" (vilket är en 2d array?) för att sedan skicka vidare till funktionen som loopar igen och sedan skriver ut informationen i en log fil.

static char info_log[15][80]; void write_log(char *log[]) { FILE *fp; fp = fopen("log.txt", "a"); int i; for (i = 0; log[i] != '\0'; i++) { fputs(log[i], fp); } fclose(fp); } // int main strcpy(info_log[0], "Hello"); strcpy(info_log[1], "This is a test"); strcpy(info_log[2], "I surely wonder if this works correctly."); write_log(info_log);

Error output:

main.c:177:3: warning: passing argument 1 of ‘write_log’ from incompatible pointer type [enabled by default] write_log(info_log); ^ main.c:77:6: note: expected ‘char **’ but argument is of type ‘char (*)[80 ’ void write_log(char *log[]) { ^

Har kollat blandannat denna sidan tutorialspoint.com vilket jag gillar, lättförstådd och bra information.

Kompilerar med GCC på linux, vilket ger sådär intressanta felmeddelanden.

Char med "strings" och arrays gör mig en del vilsen om hur jag ska hantera dem.
Finns såklart logik här också, bara jag som inte förstått det riktigt.

Visa signatur

Speldator: [Intel Core i7 4790K] [ASUS Matrix GTX 780Ti x2] [ASUS MAXIMUS VII HERO] [Corsair Dominator Platinum 32GB] [Windows 7] [Logitech G400S] [Microsoft Ergonomic 4000] [BenQ XR3501 35" (HDMI)] [BenQ G900W 19" (VGA)]

Serverdator: [Intel Core i7 6850K] [ASUS X99-E WS] [Corsair Vengeance LPX 64GB] [2x Crucial MX300 1TB] [Cooler Master V1200] [CentOS 7]

Permalänk
Tangentbordskonnässör

Nu har jag inte tittat på C-kod på väldigt länge, men här är vad jag kommer ihåg rakt av från skallen.

En string är en array av chars.
Du definerar hur stor din array med "chars" ska vara (alltså strängens längd).

char massaOrd[300]; strcpy(massaOrd, "Här skriver vi en massa ord, men får inte överskrida 300");

Testa först att bara köra ett argument, får du det att fungera så kan du googla på "append string C programming" så bör du få fram hur du kan få in fler variabler i en och samma input variabel.

För att förtydliga så ser alltså arrayen ut såhär efter strcpy som var gjort i codeblocket ovan:
massaOrd[0] == H
massaOrd[1] == ä
massaOrd[2] == r
osv osv osv...

Skippa alltså din 2d array du gjort.

Edit igen:
Äh, vafan... Nu sitter jag inte i linux så jag kan testa själv. Men testar att bygga om åt dig så får vi se om det fungerar med mitt kodblock.

void write_log(char *log[]) { FILE *fp; fp = fopen("log.txt", "a"); int i; for (i = 0; log[i] != '\0'; i++) { fputs(log[i], fp); } fclose(fp); } // int main char info_log[150]; strcpy(info_log, "I surely wonder if this works correctly."); write_log(info_log);

Permalänk
Medlem

Vad händer om du definierar funktionen med argumentet char *log[80] istället för char *log[]?

Permalänk

@huttala:
Hej!

Koden fungerar bra fram tills att det är dags att gå igenom array:en med for loopen för att sedan skriva ner varje char "sträng" till filen.

Vet att något där är fel, sitter och funderar.

Visa signatur

Speldator: [Intel Core i7 4790K] [ASUS Matrix GTX 780Ti x2] [ASUS MAXIMUS VII HERO] [Corsair Dominator Platinum 32GB] [Windows 7] [Logitech G400S] [Microsoft Ergonomic 4000] [BenQ XR3501 35" (HDMI)] [BenQ G900W 19" (VGA)]

Serverdator: [Intel Core i7 6850K] [ASUS X99-E WS] [Corsair Vengeance LPX 64GB] [2x Crucial MX300 1TB] [Cooler Master V1200] [CentOS 7]

Permalänk

Så här har jag för mig att det fungerar...

En char *[] som din funktion använder hoppar enligt följande när du indexerar den:

char[x][y] hoppar enligt följande formel (x * y)

En char [15][80] hoppar enligt följande när du indexerar den:

char[x][y] hoppar enligt följande formel (x * 80 + y)

Detta fungerar för mig.

#include <stdio.h> #include <stdlib.h> #include <string.h> static char info_log[15][80] = {0}; void write_log(char log[15][80]) { FILE *fp; fp = fopen("log.txt", "a"); int i; for (i = 0; log[i][0] != '\0'; i++) { fputs(log[i], fp); } fclose(fp); } int main(int argc, char *argv) { snprintf(info_log[0], 80, "Hello\n"); snprintf(info_log[1], 80, "This is a test\n"); snprintf(info_log[2], 80, "I surely wonder if this works correctly.\n"); write_log(info_log); }

Försök förstå de korrigeringar jag gjort i koden också för att få programmet att köra igenom felfritt.

Tillägg:
Detta fungerar också på rad 7

void write_log(char log[][80]) {

Tillägg 2:
Ändrade strcpy till snprintf för att göra koden lite säkrare.

Permalänk

@Korkskruv:
Hej!

Yes, detta fungerar fint.

Jag ska sätta mig ner och gå igenom varje steg som jag verkligen får in allt som händer och varför.

Tack så mycket för förklaring.

Visa signatur

Speldator: [Intel Core i7 4790K] [ASUS Matrix GTX 780Ti x2] [ASUS MAXIMUS VII HERO] [Corsair Dominator Platinum 32GB] [Windows 7] [Logitech G400S] [Microsoft Ergonomic 4000] [BenQ XR3501 35" (HDMI)] [BenQ G900W 19" (VGA)]

Serverdator: [Intel Core i7 6850K] [ASUS X99-E WS] [Corsair Vengeance LPX 64GB] [2x Crucial MX300 1TB] [Cooler Master V1200] [CentOS 7]

Permalänk
Medlem

Se denna sida för en förklaring varför det inte fungerar. Kortfattat så måste du ange alla dimensioner förutom den första när du skickar en array på det där sättet. Om du vill undvika att hårdkoda dimensionen i write_log så kan du ändra till t.ex. static char* info_log[15] och allokera minne för strängarna dynamiskt istället.