string i C
string i C
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>
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>
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
Lite bättre förklarad kanske.http://irc.essex.ac.uk/www.iota-six.co.uk/c/g4_strcpy_strncpy_strcmp.asp
-
- EF Sponsor
- Inlägg: 2109
- Blev medlem: 27 augusti 2005, 20:57:58
- Ort: Borlänge
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));
#include <string.h>
char string[16];
strncpy(string, "Hello World", sizeof(string));
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!
Prova igen, strncpy är bättre!
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:
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:
Slutsatsen jag drar är att du - tyvärr - inte kan använda strncpy i det här fallet, eftersom du har en konstantptr = 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")
Ä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.
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.
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?
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?