Output: C:\test.cpp(42) : error C2440: 'initializing' : cannot convert from 'char [5]' to 'char []' There is no context in which this conversion is possible C:\test.cpp(42) : error C2040: 'bb' : 'char' differs in levels of indirection from 'char [5]' C:\test.cpp(42) : error C2040: 'cc' : 'char' differs in levels of indirection from 'char [4]'
Egentlig findes der ikke strenge i C, istedet bruger arrays of char. Når skriver "char[] xx" laver du en pointer til det array. Når du skirver char[] xx = "Noget memory" afsætter du memory til det array og initialiserer det med en tekst. Du kan også allokere memory uden at initalisere det med f.eks "char xx[32]" prøv følgende:
En mere simple måde at sætte strenge og tal sammen på er, at bruge funktionen sprintf.
sprintf fungerer lige som printf, den skriver blot output til en buffer i stedet for stdout. I dit eksempel fra før kunne du have lavet dd således:
sprintf(dd, "%s%s%s", aa, bb, cc);
%s betyder "her skal stå en streng", og funktionen printer så strengen ind på %s's plads. Det gør jeg så 3 gange lige efter hinanden, og din streng er sat sammen! Du skal dog lige være opmærksom på, at strengen dd skal være stor nok til at alle de tre andre strenge kan stå i den. Funktionen checker ikke noget, og hvis ikke der er plads nok, så får du en access violation.
C++ er ikke andet end standard c med lidt ekstra muligheder, så som klasser osv. Men grundstenene i c++ er de samme som i c, og måden at håndtere strenge på er den samme! Du kan selvfølgelig nemt lave din egen strengklasse, og det er også ofte noget af det aller første man laver, når man begynder at kode c/c++, da man skal bruge strenge hele tiden. Derfor er det ret smart at have noget testet kode, som man bruger alle steder, i stedet for at lave forskellige felj forskellige steder.
Du kan sikkert godt finde nogle streng-klasser rundt omkring på nettet, men jeg vil anbefale dig at lave din egen, da du så bedre forstår hvad der egentlig sker. Det er i øvrigt en rigtig god øvelse som nybegynder.
Error: test.cpp E:\slet\test.cpp(10) : error C2440: 'initializing' : cannot convert from 'char' to 'char []' There are no conversions to array types, although there are conversions to references or pointers to arrays E:\slet\test.cpp(22) : error C2440: 'initializing' : cannot convert from 'char [5]' to 'char' This conversion requires a reinterpret_cast, a C-style cast or function-style cast Error executing cl.exe.
Problemet er, at du har erklæret "bla1" samt parameteren "input" som en enkelt karakter, hvor du i virkeligheden ville have haft en streng (dvs. en char*).
De fleste C++ compilere inkludere faktisk en foruddefineret streng klasse - ligeledes de fleste steder implementeret med navnet 'AnsiString'. Pricinpperne for brugen er meget analoge til char[], men den eliminerer ofte muligheden for nogle af de fælder, som du allerede HAR opdaget - f.eks. memoryoverskrivningen i 'sprintf(bla, "....'. Samtidigt er diverse operatorer overloaded, hvilket gør det mere enkelt at flytte rundt på strengenes indhold, lave sammenligninger osv. :
AnsiString A,B; : if(A == B) // I modsætning til strcmp(A, B) == 0 : A = B; // I modsætning til strcpy(A, B) : A = B + " osv."; // I modsætning til strcpy(A, B); strcat(A, " osv.");
AnsiString er vel noget Borland Builder specifikt, og ikke noget der generelt er med i en c++ compiler? AnsiString (Borland Builder version) er i øvrigt lavet i objekt pascal og ikke C++, da den er en del af VCL, eller hva'? Jeg må nok indrømme at jeg taler ud fra hukommelse, da jeg ikke har Borland på min computer mere. Jeg bruger pt kun Visual og gcc/g++ (Linux), og her er jeg bestemt ikke bekendt med nogen AnsiString klasse.
dmk >> Den findes også i VB, hvor den blot hedder String. Jvnf. Borlands manualer (og navnet) er det ganske alm. ANSI C++.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.