错误:' strstr'在这方面没有申明

时间:2015-11-10 15:03:44

标签: c++ raspberry-pi2 strstr

我正在使用共享内存在raspberry pi上编写应用程序。我在我自己编写的共享内存库中使用函数strstr()。当我使用clang ++在OS X上编译库时,我没有错误。如果我在我的覆盆子pi上编译它我得到错误:' strstr'未在此范围内宣布。

我试图更新我的树莓但没有成功,你能给我任何提示或解决方案该做什么。

页眉Datei

#ifndef SHAREDMEMORY_H
#define SHAREDMEMORY_H

#include <string>
#include <cstdlib>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <iostream>

#define MAX_SERVICES 99

/**
 * Datei mit der Datenbank.
 */
#define FILEPATH "database.dat"
/**
 * Anzahl der Zeichen in der
 * Datenbank.
 */
#define CHARACTERS 2500
/**
 * Größe der Datenbank.
 */
#define FILESIZE (CHARACTERS*sizeof(char))

class SharedMemory {
public:
    /**
     * Constructor 
     */
    SharedMemory();
    /**
     * Desctructor
     */
    ~SharedMemory();
    /**
     * Method to open file
     * @param string: Path to file, has to exist
     * @param int: for reading 0 
     *             for writing 1
     * @return bool: true on success
     *               false on error
     */
    bool openFile( std::string, int );
    /**
     * Method to map file to memory
     * @param string: Path to file, has to exist
     * @param int: for reading 0 
     *             for writing 1
     * @return bool: true on success
     *               false on error
     */
    bool mappingFile( int );
    /**
     * Method to remove file from memory
     * @return bool: true on success
     *               false on error
     */
    bool unmapFile();
    /**
     * Method to write information to file
     * @param string: data to write
     * e.g. string="#1:127.0.0.1:8000", #number range 0-99.
     * @return bool: true on success
     *               false on error
     */
    bool set( std::string );
    /**
     * Method to read information from file
     * @param string: need to cointains id, if success
     *                then contains info from id.
     *  e.g. string="1", number range "0"-"99".
     * @return bool: true on success
     *               false on error
     */
    bool get( std::string& );
private:
    /**
     * Datei-Deskriptor.
     */
    int fd;
    /**
     * Zeiger auf Dateiinhalt.
     */
    char *mapPointer;
    /**
     * Path to file
     */
    std::string filePath;
};


#endif /* SHAREDMEMORY_H */

CPP-Datei

#include "SharedMemory.h"

SharedMemory::SharedMemory() { }

SharedMemory::~SharedMemory() { }

bool SharedMemory::openFile( std::string _path, int mode ) {
    if ( mode ) {
        fd = open( _path.c_str(), O_RDWR, (mode_t)0600 );
    } else {
        fd = open( _path.c_str(), O_RDONLY, (mode_t)0600 );
    }
    if ( fd == -1 ) {
        return false;
    }

    return true;
}

bool SharedMemory::mappingFile( int mode ){
    void* tmpPointer;
    if ( mode ) {
        tmpPointer = mmap( 0, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );
    } else {
        tmpPointer = mmap( 0, FILESIZE, PROT_READ, MAP_SHARED, fd, 0 );
    }

    if( tmpPointer == MAP_FAILED ) {
        close( fd );
        return false;
    } 
    mapPointer = (char*) tmpPointer;

    return true;
}

bool SharedMemory::unmapFile() {
    int ret = munmap(mapPointer, FILESIZE);
    close( fd );
    if ( ret == -1 ) {
        return false;
    }

    return true;
}

bool SharedMemory::set( std::string s ) {
    /**
     * Filter id, find the id in the file.
     * If Values exist and id is valid, insert value
     * -> if value not exists, insert "No_Service".
     * if given id is invalid, return false
     */
    int mid = s.find( ";" );
    int begin = s.find( "#" );
    std::string id = s.substr( begin + 1, mid - begin);
    std::string info = s.substr( mid + 1, s.length() );
    if ( info == "" ) {
        info = "No_Service";
    }
    char* i = strstr( mapPointer, id.c_str() );
    while ( *i++ != ';' );
    for ( auto x: info ) {
        *i++ = x;
    }
    for ( int j = 0; j < ( 20 - info.length() ); ++j ) {
        *i++ = ' ';
    }

    return true;
}

bool SharedMemory::get( std::string& id ){
    /**
     * Filter id, find the id in the file.
     * save data in string s.
     */
    int tmp;
    try {
        tmp = stoi( id );
    } catch ( ... ) {
        id = "No_Service";
        return false;
    }

    if ( tmp > 100 || tmp < 1 ){
        id = "No_Service";
        return false;
    } 

    id += ";";
    char* i = strstr( mapPointer, id.c_str() );
    while ( *i++ != ';' );
    id = "";
    do {
        id += *i++;
    } while( *i != ' ' && *i != ';' );

    if ( id == "No_Service" ){
        return false;
    }

    return true;
}

1 个答案:

答案 0 :(得分:1)

尝试添加cstring(并调用std::strstr)或包括string.h

这在文档中指定:http://en.cppreference.com/w/cpp/string/byte/strstr