Sida 1 av 2
string i C
Postat: 5 maj 2008, 21:32:47
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>
Postat: 5 maj 2008, 21:37:26
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
Postat: 5 maj 2008, 21:41:11
av thepirateboy
Postat: 5 maj 2008, 21:41:16
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!

Postat: 5 maj 2008, 21:41:16
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));
Postat: 5 maj 2008, 21:43:57
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

med samma svar i stort sett

Postat: 5 maj 2008, 21:58:39
av baltazar
Ha ha... ja ni programmerare är rätt festliga, ni lever verkligen för ert intresse
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"
Postat: 5 maj 2008, 22:27:56
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!
Postat: 5 maj 2008, 22:40:36
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.
Postat: 5 maj 2008, 23:01:59
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.
Postat: 6 maj 2008, 07:49:09
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!
Postat: 6 maj 2008, 11:05:03
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
Postat: 6 maj 2008, 12:23:58
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.
Postat: 6 maj 2008, 17:15:45
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!
Postat: 6 maj 2008, 18:04:52
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?