string i C

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
baltazar
Inlägg: 106
Blev medlem: 19 oktober 2003, 21:50:18

string i C

Inlägg av baltazar »

Jag kan tänka mig att det finns en del riktiga programmeringsproffs här på forumet, men för vissa av oss är inte C-språket något som är medfött, därför undrar jag nu om ni kan hjälpa mig med en sak.
Jag använder en C-kompilator som heter PCWH.

Såhär skriver jag idag:
printf(lcd_putc,"Hello world");

Ungefär såhär skulle jag vilja göra:
char string[16]; //Jag vill alltså ha en sträng som kan innehålla 16 char
string = "Hello world"; //Stoppa i Hello world i strängen
printf(lcd_putc, string); //Skriv ut

Jag antar att jag måste #include <string.h>
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

Du kan normalt sett inte bara kopiera över en sträng med '=' utan man får använda något kommando som kopierar tecken för tecken. Det vanligaste funktionen för det är om jag inte minns fel strcpy(målsträng,sträng).

Lite bättre förklarad kanske.http://irc.essex.ac.uk/www.iota-six.co.uk/c/g4_strcpy_strncpy_strcmp.asp
thepirateboy
EF Sponsor
Inlägg: 2108
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

Användarvisningsbild
JonasJ
Inlägg: 653
Blev medlem: 11 september 2007, 16:02:26
Ort: Kinna
Kontakt:

Inlägg av JonasJ »

Använd hellre strncpy där du också anger maximalt antal tecken att kopiera så att du inte råkar skriva bort dig i minnet pga. för lång sträng eller saknade \0 på strängen.

Edit: Oj, samtidigt! :)
Senast redigerad av JonasJ 5 maj 2008, 21:41:59, redigerad totalt 1 gång.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

string.h innehåller funktioner för att *manipulera* strängar. Den är i princip inte nödvändig, men vill man ha funktioner som strcpy så måste man inkludera den. Men strncpy är att föredra så du inte skriver över den tilldelade minnesarean;

#include <string.h>
char string[16];
strncpy(string, "Hello World", sizeof(string));
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

Juat det ja, strncpy är att föredra om man inte vill få "buffer overload" och andra jobbiga fel som är ett helvee att felsöka...

EDIT: Vi som hänger här har *verkligen* inga liv :) Tre svar på samma minut :D med samma svar i stort sett :D
Användarvisningsbild
baltazar
Inlägg: 106
Blev medlem: 19 oktober 2003, 21:50:18

Inlägg av baltazar »

Ha ha... ja ni programmerare är rätt festliga, ni lever verkligen för ert intresse :D

Min kompilator måste vara helt galen...
Jag testade att bara skriva in:
char string[16];
strncpy(string, "Hello World");
och kompilera, då tycker den:
"Attempt to create a pointer to a constant"
Användarvisningsbild
baltazar
Inlägg: 106
Blev medlem: 19 oktober 2003, 21:50:18

Inlägg av baltazar »

Nu löste det sig, jag tror detta är en riktig skitkompilator.
Men detta fungerade:
char string[16];
strcpy(string, "abcd");
printf(lcd_putc,"%s", string);

Tack för hjälpen!
Användarvisningsbild
AndLi
Inlägg: 17362
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Inlägg av AndLi »

strncpy ska ha tre argument, du måste ange max stränglängd också!

edit: char * strncpy(char *dest, const char *src, size_t n);
n= längd 16 i ditt exempel.
Användarvisningsbild
baltazar
Inlägg: 106
Blev medlem: 19 oktober 2003, 21:50:18

Inlägg av baltazar »

Jag har provat det, men den köper inte det. Jag får "Attempt to create a pointer to a constant"
Men det kvittar, det funkar fint med strcpy. Och om jag bara ser till att inte skicka in mer än 16 tecken så ska den väl funka lika bra antar jag.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Nej, det är är inte alls säkert att det fungerar lika bra! Som sagt, om det av någon aneldning inte finns en strängavslutning på ingående sträng så kommer strcpy kopiera strängelement tills den hittar ett sådan någon annanstans i minnet, då har du garanterat spännande problem att bita i!

Prova igen, strncpy är bättre!
effo
Inlägg: 49
Blev medlem: 13 april 2008, 11:45:21
Ort: Linköping

Inlägg av effo »

Ok, jag är ingen C-guru, men jag tror jag vet vad som är fel

Kompilatorn säger "Attempt to create a pointer to a constant". Är inte "Hello world" just en konstant? Anger man strängen i anropet till strcpy så anger man ju pekaren till en konstant. I 'vanlig' C tror jag detta är OK men kanske inte i den här kompilatorn...?

Om man googlar på pcwh så kan man hitta en PDF som verkar vara en manual till kompilatorn. På sidan 247 (numrerad som sidan 235) hittar man en beskrivning av hur stränghanteringen fungerar. Där kan man läsa om strncpy:
ptr = strncpy(s1, s2, n) Copy up to n characters s2 -> s1

Parameters: s1 and s2 are pointer to an array of characters (or the name of the array). Note that s1 and s2 MAY NOT BE A CONSTANT (like "hi")
Slutsatsen jag drar är att du - tyvärr - inte kan använda strncpy i det här fallet, eftersom du har en konstant
SvenW
Inlägg: 1124
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Inlägg av SvenW »

Är inte "Hello world" just en konstant?
Jo, men man får en pekare till konstanten.
Detta är en egendomlighet i C.
An värre är det med
char string[16];
som är en 'array of char', men kompilatorer levererar vanligtvis en pekare.
Man kan (och kanske borde) skriva så här:

#include <string.h>

char string[16];

strncpy(&string[0], &"Hello World"[0], 16);
printf("%s\n", &string[0]);


Då blir det mer logiskt.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Man kan (och kanske borde) skriva så här (...)
Ibland kan det hjälpa, men det borde inte göra någon skillnad, det är ju precis samma sak!
SvenW
Inlägg: 1124
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Inlägg av SvenW »

Men, som jag säger, att det är samma sak är en egendomlighet. Jag vet inte om det ligger i språkets definition eller det är en pragmatisk utvidgning som flertalet kompilatorer tillhandahåller, men det känns inte riktigt logiskt att det är samma sak.
jfr:

char *s1 = "s";
char s2[2] = {'s', '\0'};

printf("s1,s2= %s %s size= %i %i\n", s1, s2, sizeof(s1), sizeof(s2));


Varför är sizeof(s1) och sizeof(s2) olika?
Skriv svar