1. ホーム
  2. c++

[解決済み】エラー:strcpyがこのスコープで宣言されていない

2022-01-22 23:20:25

質問

Ubuntu g++ version 4.4.3でコンパイルしているc++の問題で、この問題が発生しました。 この問題を解決するために含めるべきヘッダーがわかりません。ありがとうございます。

centro_medico.cpp: In constructor ‘Centro_medico::Centro_medico(char*, char*, int, int, float)’:
centro_medico.cpp:5: error: ‘strcpy’ was not declared in this scope
centro_medico.cpp:13: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:13: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp: In member function ‘Centro_medico& Centro_medico::operator=(const Centro_medico&)’:
centro_medico.cpp:26: error: ‘strcpy’ was not declared in this scope
centro_medico.cpp:39: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:39: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp: In member function ‘bool Centro_medico::quitar_medico(int)’:
centro_medico.cpp:92: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:92: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp: In member function ‘void Centro_medico::mostrar_especialidades(std::ostream&) const’:
centro_medico.cpp:123: error: ‘strcmpi’ was not declared in this scope
centro_medico.cpp: In member function ‘void Centro_medico::mostrar_horarios_consulta(char*) const’:
centro_medico.cpp:162: error: ‘strcmpi’ was not declared in this scope
centro_medico.cpp: In member function ‘void Centro_medico::crea_medicos()’:
centro_medico.cpp:321: warning: deprecated conversion from string constant to ‘char*’
centro_medico.cpp:321: warning: deprecated conversion from string constant to ‘char*’


medico.cpp

#include "medico.h"
#include <cstdlib>
#include <iostream>
#include <stdlib>  
#include<cstring>
#include<string>

long Medico::total_consultas=0; 
Medico::Medico(char *nom,char * espe,int colegiado,int trabajo)
{
int i;
strcpy(nombre,nom);
strcpy(especialidad,espe);
num_colegiado=colegiado;
num_horas_diarias=trabajo;
citas_medico= new Cita*[5]; // 5 Días de las semana, de Lunes a Viernes.
for (i=0;i<5;i++)
citas_medico[i]=new Cita[num_horas_diarias];
}



Medico::Medico(const Medico &m){
  int i;
  citas_medico=new Cita*[5];
  for (i=0;i<5;i++)
   citas_medico[i]=NULL;
 (*this) = m;
}

Medico &Medico::operator=(const Medico &m){
 int i,j;
 if (this != &m) { // Para evitar la asignación de un objeto a sí mismo
     strcpy(nombre,m.nombre);
     strcpy(especialidad,m.especialidad);     
     num_colegiado=m.num_colegiado;
     num_horas_diarias=m.num_horas_diarias;
     for (i=0;i<5;i++){
      delete citas_medico[i]; 
      citas_medico[i]=new Cita[num_horas_diarias];
      for(j=0;j<num_horas_diarias;j++){
       citas_medico[i][j] = m.citas_medico[i][j] ;
       }
     }     
  }
 return *this;
}


medico.h

#pragma once
#include <cstdlib>
#include <iostream>
using namespace std;
#include "cita.h"

class Medico
{
 private:
                char nombre[50];
                char especialidad[50];
                int num_colegiado;
                int num_horas_diarias;
                Cita **citas_medico;
                static long total_consultas;                
 public:
                void mostrar_calendario_citas(ostream &o=cout) const;
                bool asignar_cita(int d, int hor,Paciente *p=NULL);
                void anular_cita(int d, int hor);
                bool consultar_cita(char dni[10], int modificar=0);
                void modificar_cita(int d, int hor);                
                void vaciar_calendario_citas();
                void borrar_calendario_citas();                
                char* get_especialidad(char espec[50]) const;
                char* get_nombre(char n[50]) const;
                int get_num_colegiado() const;
                int get_num_horas() const;
                void set_num_horas(int horas);
                void mostrar_info(ostream &o=cout) const;
                static long get_total_consultas();
                Cita* operator[](int dia);
                void eliminar_calendario_citas();
                void crear_calendario_citas();    
                Medico(char *nom,char * espe,int colegiado,int trabajo);
                Medico(const Medico &m);
                Medico &operator=(const Medico &c);
                void operator delete(void*);
                ~Medico();
 };
 ostream& operator<<(ostream &o, Medico &c);
 ofstream& operator<<(ofstream &fichero, Medico &m);
 ifstream& operator>>(ifstream &fichero, Medico &m);

解決方法は?

観察事項

  • #include <cstring> は、std::strcpy()を導入する必要があります。
  • using namespace std; (medico.hに書かれているように)は、以下の識別子を導入しています。 std:: をグローバル名前空間に追加します。

はともかくとして using namespace std; アプリケーションの規模が大きくなると (グローバル名前空間に膨大な数の識別子を導入することになるので)、やや不格好になります。 決して 使用 using をヘッダーファイルの中に入れてください(下記参照!)。 using namespace を導入した識別子に影響を与えません。 の後に という文があります。

( using namespace std は、medico.cppに含まれるヘッダに書かれていますが #include <cstring> 来る の後に ということです)。

私からのアドバイスです。 を配置します。 using namespace std; (どうしても使いたいなら)medico.cppに書いてください。 インクルードの後に を使用し、明示的に std:: をmedico.hに追加しました。


strcmpi() Windowsでは定義されていますが、Linuxでは大文字小文字を区別しない比較を行うため、標準的な関数ではありません。

(一般論として、私は以下のものを挙げたいと思います。 この回答 すべてのアプリケーションがそうであるように、Unicodeを考慮したCとC++の文字列処理に関して、quot;proper"。要約:標準の はできません。 は、これらを正しく処理することができます。 する 使用 ICU .)


warning: deprecated conversion from string constant to ‘char*’

文字列定数"とは、文字列リテラル(例えば "Hello" を使用します。その型は const char[] の配列です。 定数 文字を変更することができないため)。配列をポインタに代入することはできますが,ポインタに代入すると char * を削除する、つまり const という修飾子を付けると、ご覧のような警告が発生します。


OTの明確化。 using は、そのヘッダーを含むすべての人の識別子の可視性を変更しますが、これは通常、ヘッダーファイルのユーザが望むことではありません。例えば、私は std::string と、自分で書いた ::string は、私のコードにぴったりです。 あなたのmedico.hをインクルードしない限り というのも、この2つのクラスは衝突してしまうからです。

を使用しないでください。 using をヘッダーファイルで使用します。

また、実装ファイルであっても、多くの曖昧さをもたらす可能性があります。実装ファイルでも明示的な名前空間を使うべきケースはあるのです。