Permalänk
Medlem

C++ pekare och array

Hjälp!!
Jag skulle skriva ett program som läser in för- och efternamn, sen ska den redera alla tecke i förnamnet utom det första bokstaven

#include <iostream> #include <cstring> #include <conio.h> using namespace std; const int SIZE = 40; const char M = 32; //mellanslag tenget char name[SIZE]; char *p = name; int i; int main() { cout << "skriver in namn: "; cin.getline(name, SIZE); ptr++; for (i = strlen(p);p[i] != M; i--) { strcat(name, p[i]); } ptr='\0'; cout << namn << endl; _getch(); return 0; }

jag har kommit så här lång med har kört fast med att överföra efternamnet till "name".
Jag har försökt att lösa det i 2 dagar nu :P.

Permalänk

Eftersom du använder c++ så hade det varit enklare att lagra indatan i en std::string.

http://www.cplusplus.com/reference/string/string/

Permalänk
Medlem

using namespace std; int main(int argc, char** argv) { cout << "name surname:" << endl; string s1,s2; cin >> s1 >> s2; cout << s1[0] << " " << s2 << endl; return 0; }

osså

name surname: John Doe J Doe

Visa signatur

weeeee

Permalänk
Medlem

Det är nämligen så att namn och efternamn ska lagra i samma sträng, och man ska använda array och pekare för att fixa detta utan hjälp sträng (typ lagra namn i a[] och efternamn i b[]) för att få god känd.

Permalänk
Medlem

Intressant uppgift som typiskt kan dyka upp på tekniska jobbintervjuer för Microsoft/Google.

Att göra en in-place reverse på alla orden i en sträng utförs "vackrast" på följande sätt:

1. Gör först en in-place reverse på alla tecknen i strängen. I.e. swappa första och sista bokstav, sedan andra och näst sista, o.s.v (std::reverse).

2. Lokalisera sedan varje individuellt ord i strängen (strtok?) och gör in-place reverse på alla tecknen i orden.

Voilá! Ordentligt skriven och du får en lösning på linjär tid och med konstant minne.

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk
Medlem

Tack för hjälpen.

Nu är det lös. Här är min version av programet om nån kanske ha nytta av

const int SIZE = 40;
const char SPC = 32; //mellanslag tenget

char namn[SIZE];
char *ptr = namn;
int i;

void meny();
void enter(), display(), edit();

int main()
{
bool quit = false;
int val;

while(!quit)
{
meny();
cin >> val;
cin.ignore(80,'\n');

switch(val)
{
case 0:
quit = true;
break;
case 1:
enter();
break;
case 2:
display();
break;
}
}

return 0;
}

void meny()
{
system("CLS");
cout << "Var god valj" << endl;
cout << "============" << endl << endl;
cout << "0: Avsluta" << endl;
cout << "1: Enter" << endl;
cout << "2: Display" << endl << endl;
}
void enter()
{
system("CLS");
cout << "Skriver in ett namn: ";
cin.getline(namn, SIZE);

edit();
}
void edit()
{
i = 0;

//hitta mellangetslaget mellan förnamn och efternamn.
do
{
i++;
}while(ptr[i] != SPC);

int t = 1;

//ersätta array[1] med de tecke som finns
// i ptr[i] dvs från och med mellanslaget.
do
{
//namn[0] är första bokstaven som man vill spara
namn[t] = ptr[i];
t++;
i++;
}while (namn[t] != '\0');
}

void display()
{
system("CLS");
cout << namn << endl;
_getch();
}

Permalänk

Bra gjort!
Lite tips om hur du hade kunnat förbättra din kod.

För att hitta mellanslaget så är det tydligare att söka efter ' '. <- Notera mellanslaget.
På det sättet så behöver man ej veta vilken siffra ett tecken motsvarar. Det sköts av kompilatorn.

const char SPC = ' '; //mellanslag tenget

Sen hade du inte behövt kopiera alla tecken.

Tänk dig till exempel att namnet består av följande tecken Abc Def.
Då hade du kunnat kopiera A till position c och sedan skrivit ut därifrån.

#include <iostream> int main() { char namn[50] = "Abc Def"; int i; // Använder tecknet blanksteg som stopp. for (i=0; namn[i] != ' ' && i<50; i++) ; // Gör inget. // Ifall något blivit fel i loopen ovan. if (i == 0 || i == 50) { std::cout<<"Felaktig inmatning."<<std::endl; return 0; } // Korrigerar i till positionen innan blanksteget. i--; // Kopierar först tecknet i strängen till position i. namn[i] = namn[0]; // Skriver ut från pekaren namn förskjutet ett visst antal tecken. std::cout<<"Namn: "<<namn+i<<std::endl; }