Sponsored Content
Top Forums Programming Map with struct as key and vector as value Post 302917587 by Corona688 on Wednesday 17th of September 2014 03:54:24 PM
Old 09-17-2014
Your program is a mess, had no error checking and crashed nonstop. That's why strtok is considered "evil" -- if you don't bother checking, bad things will happen. But a little checking makes it fine.

Nearly every line ended up commented out and replaced, I had to rewrite it instead.

Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>     // You need this for atoi, see 'man atoi'

#include <map>
#include <vector>
#include <string>
using namespace std;

struct grades {
    string course_Abrrev;
    int course_Credit;
    char course_Grade;
};

int main(void)
{
        char buf[4096];
        map<int, string> names;
        map<int, vector < grades > > marks;

        // Read a line into 'buf'
        while(fgets(buf, 4096, stdin) != NULL)
        {
                // Array of 10 pointers.
                // Each will point to a position inside 'buf', or
                // just point to "".
                const char *token[10];
                grades grade;
                int n=0;

                token[n]=strtok(buf, " \r\n\t");
                while(n < 10)
                {
                        n++;
                        token[n]=strtok(NULL, " \r\n\t");
                        if(token[n]==NULL) break;
                }
                // Set all NULL strings to "" instead.
                while(n < 10) token[n++]="";

                // There, now we have a nice array of tokens
                // which are all guaranteed not to crash when used.
                // The very worst any of them will be is blank...

                n=atoi(token[0]);       // Get student ID

                grade.course_Abrrev=token[2];
                grade.course_Credit=atoi(token[3]);
                grade.course_Grade=*(token[3]);

                names[n]=token[1];              // Store name
                marks[n].push_back(grade);      // store grade
        }

        for(map<int, string>::iterator i=names.begin();
                i != names.end();
                i++)
        {
                int id=(*i).first;
                printf("%d %s\n", id, (*i).second.c_str());

                for(vector<grades>::iterator n=marks[id].begin();
                        n != marks[id].end();
                        n ++ )
                {
                        printf("\t%s %d %c\n",
                                (*n).course_Abrrev.c_str(),
                                (*n).course_Credit,
                                (*n).course_Grade);
                }

        }
}

This User Gave Thanks to Corona688 For This Post:
 

9 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

Pressing backspace key simulates enter key

Hi, Whenever i press the backspace key, a new line appears, i.e. it works like a enter key. :confused: Thanks (2 Replies)
Discussion started by: vibhor_agarwali
2 Replies

2. Programming

Vector Traversing

Hi i have the following structure struct S { char Mod_num; char val; char chr_nm_cd; } I am reading a 2GB file and inserting into the structure and writing into a vector. I feel like only vector will be a right option. I tried with multimap but it is memory intensive and hence i... (1 Reply)
Discussion started by: dhanamurthy
1 Replies

3. UNIX for Dummies Questions & Answers

How to access a struct within a struct?

Can someone tell me how to do this? Just a thought that entered my mind when learning about structs. First thought was: struct one { struct two; } struct two { three; } one->two->three would this be how you would access "three"? (1 Reply)
Discussion started by: unbelievable21
1 Replies

4. Programming

C++ Map using a Vector as a Value Type?

I modified some code I found on Wikipedia concerning maps to see if it would work before applying it to a project I'm working on that has a similar idea. What I would want is for a user to be able to enter sentences and then be able to distinguish how many times a the person entered a word in a... (4 Replies)
Discussion started by: kcgb20
4 Replies

5. Solaris

Solaris 8 ssh public key authentication issue - Server refused our key

Hi, I've used the following way to set ssh public key authentication and it is working fine on Solaris 10, RedHat Linux and SuSE Linux servers without any problem. But I got error 'Server refused our key' on Solaris 8 system. Solaris 8 uses SSH2 too. Why? Please help. Thanks. ... (1 Reply)
Discussion started by: aixlover
1 Replies

6. Programming

Storing C++-struct in file - problem when adding new item in struct

Hi, I have received an application that stores some properties in a file. The existing struct looks like this: struct TData { UINT uSizeIncludingStrings; // copy of Telnet data struct UINT uSize; // basic properties: TCHAR szHost; //defined in Sshconfig UINT iPortNr; TCHAR... (2 Replies)
Discussion started by: Powerponken
2 Replies

7. Programming

Array and Vector

Hi all, from my understanding I understand that I can use array in this manner. struct test { int a; int b; int c; }; test testing; //creating an array with the structer type testing.a=1; testing.b=2; testing.c=3; If I'm not wrong we can use array in this manner,... (12 Replies)
Discussion started by: vinzping
12 Replies

8. Programming

vector c++

hello guys. i'm new to c++. i've problem using two dimensional vector. i've a project of making conway's game of life. this is the code that i have made so far. my problem is how can i give a two dimensional vector through main. glider.vec1 = vec; is not correct way to give a two... (2 Replies)
Discussion started by: nishrestha
2 Replies

9. Shell Programming and Scripting

Vector normalisation

In AWK For 3 individual vectors of the form: -2.772 -9.341 -2.857 -5.140 -6.597 -1.823 -2.730 -5.615 1.159 I would like to write a script that parses line by line to (i) normalise, (ii) divide by the norm for *each* vector. I.e. sqrt(-2.772^2 + -9.341^2 + -2.857^2)=10.154 ... (4 Replies)
Discussion started by: chrisjorg
4 Replies
WCSTOK(3)						     Linux Programmer's Manual							 WCSTOK(3)

NAME
wcstok - split wide-character string into tokens SYNOPSIS
#include <wchar.h> wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim, wchar_t **ptr); DESCRIPTION
The wcstok() function is the wide-character equivalent of the strtok(3) function, with an added argument to make it multithread-safe. It can be used to split a wide-character string wcs into tokens, where a token is defined as a substring not containing any wide-characters from delim. The search starts at wcs, if wcs is not NULL, or at *ptr, if wcs is NULL. First, any delimiter wide-characters are skipped, that is, the pointer is advanced beyond any wide-characters which occur in delim. If the end of the wide-character string is now reached, wcstok() returns NULL, to indicate that no tokens were found, and stores an appropriate value in *ptr, so that subsequent calls to wcstok() will continue to return NULL. Otherwise, the wcstok() function recognizes the beginning of a token and returns a pointer to it, but before doing that, it zero-terminates the token by replacing the next wide-character which occurs in delim with a L'' character, and it updates *ptr so that subsequent calls will continue searching after the end of recognized token. RETURN VALUE
The wcstok() function returns a pointer to the next token, or NULL if no further token was found. CONFORMING TO
C99. NOTES
The original wcs wide-character string is destructively modified during the operation. EXAMPLE
The following code loops over the tokens contained in a wide-character string. wchar_t *wcs = ...; wchar_t *token; wchar_t *state; for (token = wcstok(wcs, " ", &state); token != NULL; token = wcstok(NULL, " ", &state)) { ... } SEE ALSO
strtok(3), wcschr(3) COLOPHON
This page is part of release 3.27 of the Linux man-pages project. A description of the project, and information about reporting bugs, can be found at http://www.kernel.org/doc/man-pages/. GNU
1999-07-25 WCSTOK(3)
All times are GMT -4. The time now is 11:20 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy