Kontrollera om en string finns i ett fält.

Permalänk

Kontrollera om en string finns i ett fält.

Hej,

Skulle behöva skapa en kod som kollar om en inmatad string redan finns i fältet.

#include <iostream> #include <string> using namespace std; int main() { string str[10]; for (int i = 0; i < 10; i++) { cout << "Enter string: "; getline(cin, str[i]); if(/*HÄR SKA JAG KOLLA OM str[i] redan finns i fältet*/) cout << "Inmatningen finns redan i fältet."; } system("pause"); return 0; }

Hur ska jag göra? Detta är inte mitt program så sambandet kanske inte stämmer men skulle vilja veta hur man gör. Tack.

Permalänk
99:e percentilen

Vad betyder "fält" i det här sammanhanget?

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

@Alling: arrayen str[10]

Permalänk
Medlem

Lagra inte inläsningen direkt i str om det är den du vill jämföra med, lagra den i typ "string line;".

Om du nu måste ha en array (string str[10]) så måste du manuellt loopa varje element och jämföra med "line".

bool found = false; for(uint i = 0; i < 10; ++i) if(str[i] == line) found = true;

Permalänk
99:e percentilen
Skrivet av Mulle0216:

@Alling: arrayen str[10]

Vad menar du i så fall med att "KOLLA OM str[i] redan finns i fältet"?

Kan du beskriva på lite högre abstraktionsnivå vad det är du egentligen vill åstadkomma?

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

@Alling: Jag antar att han vill läsa in värden som han matar in, samt lagra dom i str[] om de inte redan existerar, men det kanske bara är jag Skulle nog hellre köra på en "std::vector<std::string> inputs;" och pushbacka nya värden, så slipper man initiering av str[] samt hålla koll på någon slags counter.

Permalänk

@Dalton Sleeper: Det är en skoluppgift och min lärare kan inte hjälpa mig. Hela uppgiften är att skapa en lista med namn och tillhörande emailaddress. Jag har då en name[10] och en email[10]. Jag väljer om jag vill registrera ett nytt namn (upp till 10 pers i nuläget.) och sedan ska jag välja om jag vill skapa en emailaddress till denna person i formatet fffeee@domän.se (3 första i för o efternamn). Dessa sex tecken ska ju inte vara samma som i någon tidigare registrerad emailaddress. Förstår ni? Eller blev det bara ännu kladdigare?

Permalänk

@Mulle0216: Löste det. Har testat denna lösning innan men måste ha gjort nåt fel då...

for (int k = 0; k < 10; k++) { if (emailtemp == email[k]) { emailexist = true; goto checkemailexist; } else emailexist = false; }

Permalänk
Medlem

@Mulle0216: goto brukar vara ajabaja, speciellt i denna typ av programmering.

Permalänk
99:e percentilen
Skrivet av Mulle0216:

@Dalton Sleeper: Det är en skoluppgift och min lärare kan inte hjälpa mig. Hela uppgiften är att skapa en lista med namn och tillhörande emailaddress. Jag har då en name[10] och en email[10]. Jag väljer om jag vill registrera ett nytt namn (upp till 10 pers i nuläget.) och sedan ska jag välja om jag vill skapa en emailaddress till denna person i formatet fffeee@domän.se (3 första i för o efternamn). Dessa sex tecken ska ju inte vara samma som i någon tidigare registrerad emailaddress. Förstår ni? Eller blev det bara ännu kladdigare?

Där kan det vara värt att fundera på om du verkligen har valt ett bra sätt att representera dina data på. Hur kopplar du ihop namn med mailadress? Jag gissar att du tänker dig att om name[ix] är en persons namn är email[ix] den personens mailadress. Men det är i regel bättre att ha en lista som innehåller, i det här fallet, par av strängar än att ha två separata listor med strängar och axla det helt onödiga ansvaret att se till att de aldrig ska hamna ur synk och att aldrig råka hantera relationen mellan dem på fel sätt.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

@Mulle0216: Du skall använda funktionen "strstr" som returnerar en pekare till första förekomsten där strängarna är lika, annars returneras "null".
https://www.tutorialspoint.com/c_standard_library/c_function_...

Permalänk
Medlem
Skrivet av Irre:

@Mulle0216: Du skall använda funktionen "strstr" som returnerar en pekare till första förekomsten där strängarna är lika, annars returneras "null".
https://www.tutorialspoint.com/c_standard_library/c_function_...

Fel språk, det är C++ det handlar om. Vill man leta efter en substräng så kan man använda std::string::find, men i det här fallet verkar TS bara vilja jämföra strängar rakt av vilket görs med ==-operatorn.

Permalänk
Medlem
Skrivet av Mulle0216:

@Dalton Sleeper: Det är en skoluppgift och min lärare kan inte hjälpa mig. Hela uppgiften är att skapa en lista med namn och tillhörande emailaddress. Jag har då en name[10] och en email[10]. Jag väljer om jag vill registrera ett nytt namn (upp till 10 pers i nuläget.) och sedan ska jag välja om jag vill skapa en emailaddress till denna person i formatet fffeee@domän.se (3 första i för o efternamn). Dessa sex tecken ska ju inte vara samma som i någon tidigare registrerad emailaddress. Förstår ni? Eller blev det bara ännu kladdigare?

Om du har name[10] så kan du ju lagra 11 namn.

Antar du inte får använda object för att hålla samman namn och mail, typiskt dumma skoluppgifter.

Om så skulle jag skapa bool check(string emailArr[10], string email) som du loopar igenom emailArr och return true/false beroende på om den hittar en matchning till email.

Permalänk
Medlem
Skrivet av perost:

Fel språk, det är C++ det handlar om. Vill man leta efter en substräng så kan man använda std::string::find, men i det här fallet verkar TS bara vilja jämföra strängar rakt av vilket görs med ==-operatorn.

OK, det var tjugo år sedan jag programmerade i C++, då fanns inte stränghantering som standard i språket, utan man fick själv programmera in detta (vilket är en bra övning).

Permalänk
Medlem

Har TS inte gått igenom klasser än så kan det finnas en möjlighet att de har gått igenom struct.

I denna uppgift kanske man därför får använda struct för att lagra namn och E-post.

struct person
{
string name;
string email;
};

struct person persons[10]; //Arrayen med 10 personer som har både namn och epost

Visa signatur

Windows 11 Pro | Intel i7 8700 | ASUS Prime Z370-P | Corsair 16GB 3000MHz | ASUS GTX 1080 | Fractal Design Define S | Corsair RM750x | Hyper 212 EVO

Permalänk
Medlem
Skrivet av Sinery:

Om du har name[10] så kan du ju lagra 11 namn.

Antar du inte får använda object för att hålla samman namn och mail, typiskt dumma skoluppgifter.

Om så skulle jag skapa bool check(string emailArr[10], string email) som du loopar igenom emailArr och return true/false beroende på om den hittar en matchning till email.

Fel. En variabel xs deklarerad med int xs[10] har plats för 10st element, från index 0 upp till och lika med 9.

Visa signatur

Arbets- / Spelstation: Arch Linux - Ryzen 5 3600 - RX 7900 XT - 32G DDR4
Server: Arch Linux - Core i5-10400F - 16G DDR4

Permalänk

#include <iostream> #include <string> #include <utility> #include <algorithm> #include <vector> int main() { std::vector<std::pair<std::string, std::string>> data = {{"A", "a@a"}, {"B", "b@b"}}; bool finished = false; while(!finished) { std::cout << "Enter string: "; std::string input; getline(std::cin, input); auto found = std::find_if(data.begin(), data.end(), [input](const std::pair<std::string, std::string>& pairVal) { return pairVal.first == input; }); if (found != data.end()) { std::cout << "Found it... Name: " << found->first << " with email: " << found->second << std::endl; finished = true; } else std::cout << "Didn't find it!" << std::endl; } return 0; }

std::vector istället för råa arrays.
std::pair för att para ihop två värden med varandra
std::find_if för att söka reda på elementet i vektorn av pairs, där ett lambda används för att bestämma vad man vill söka på (i detta fall namn).