C++字符串的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++字符串的问题相关的知识,希望对你有一定的参考价值。

在下面程序中,我定义了一个名为employee的抽象类,里面包含了返回值为char类型的函数,但是在主函数调用时,运行到时就会提示“已停止工作”,就给关了。各位帮忙看一下
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include<iostream>
#include<fstream>
using namespace std;

class dated

private:
int datedyear;
int datedmonth;
int datedday;
public:
dated()
dated(int a,int b,int c);
~dated()
void printdated()
cout<<datedyear<<"/"<<datedmonth<<"/"<<datedday<<endl;
friend class employee;

;

dated::dated(int a,int b,int c)

if(a>=1990 && a<=2011) datedyear=a;
else cout<<"所输入的年份不符合规范!";
if(b>=1 && b<=12) datedmonth=b;
else cout<<"所输入的月份不符合规范!";
if(c>=1 &&c<=31) datedday=c;
else cout<<"所输入的日期不符合规范!";


class employee <<--------------------抽象类在这

private:
int mno;
char *name; <<-------------这里我用数组也不行,就是name[10]
char *sex;
char *type;
dated dd;
public:
employee()
employee(int a,char b[10],char c[2],char d[10]);
~employee()
int getmno()return mno;
char* getname()return name; <--------调用出错的函数
char* getsex()return sex;
char* gettype()return type;
char* getdated()
char d[20];
strcpy(d,(char*)dd.datedyear);
strcat(d,(char*)dd.datedmonth);
strcat(d,(char*)dd.datedday);
return d;

void setmno(int a)mno=a;
void setname(char *a)strcpy(name,a);
void setsex(char *a)strcpy(sex,a);
void settype(char *a)strcpy(type,a);
void setdated(int a,int b,int c)dd.datedyear=a;dd.datedmonth=b;dd.datedday=c;
void printemployee();
virtual void computeSalay()=0;
;

class manager:public employee

public:
manager()cout<<"123456";
void computeSalay()cout<<"工资:"<<wage;
private:
float wage;
;

employee::employee(int a,char b[10],char c[2],char d[10])

mno=a;
strcpy(name,b);
strcpy(sex,c);
strcpy(type,d);


void employee::printemployee()

cout<<"编号:"<<mno<<endl;
cout<<"姓名"<<name<<endl;
cout<<"性别"<<sex<<endl;
cout<<"出生年月"<<getdated()<<endl;
cout<<"类别"<<type<<endl;


int main()
int p;
manager a;
char *b;
strcpy(b,a.getname()); <-------执行到这里出错
cout<<b;
system("pause");

strcpy(b,a.getname()); 这里错了。为什么呢?因为你调用strcpy函数时,参数处理得不正确。strcpy是将C风格字符串复制给字符数组,即是说strcpy的第一个参数是目标字符数组,第二个参数可以是C风格字符串,也可以说字符数组。所以说,你这里的第一个参数用错了。
改正方法:你将字符指针b改为字符数组就行啦。即是char b[100]; 至于数组大小,你自己根据需要决定啦。

再不明白的,可以去看看strcpy函数原型:
原型声明:extern char *strcpy(char *dest,char *src);
头文件:string.h 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。
参考技术A 编译了下,初步看了下编译的警告.有如下问题,看下我写的注释.
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include<iostream>
#include<fstream>
using namespace std;

class dated

private:
int datedyear;
int datedmonth;
int datedday;
public:
dated()
dated(int a,int b,int c);
~dated()
void printdated()
cout<<datedyear<<"/"<<datedmonth<<"/"<<datedday<<endl;
friend class employee;

;

dated::dated(int a,int b,int c)

if(a>=1990 && a<=2011) datedyear=a;
else cout<<"所输入的年份不符合规范!";
if(b>=1 && b<=12) datedmonth=b;
else cout<<"所输入的月份不符合规范!";
if(c>=1 &&c<=31) datedday=c;
else cout<<"所输入的日期不符合规范!";


class employee // <<--------------------抽象类在这

private:
int mno;
char *name; //<<-------------这里我用数组也不行,就是name[10]
char *sex;
char *type;
dated dd;
public:
employee()
employee(int a,char b[10],char c[2],char d[10]);
~employee()
int getmno()return mno;
char* getname()return name; //<--------调用出错的函数
char* getsex()return sex;
char* gettype()return type;
char* getdated()
char d[20];
strcpy(d,(char*)dd.datedyear);
strcat(d,(char*)dd.datedmonth);
strcat(d,(char*)dd.datedday);
return d;//函数结束后d的生命周期也结束了,这样不行。得new或malloc,还要有相应的释放


void setmno(int a)mno=a;
void setname(char *a)strcpy(name,a);
void setsex(char *a)strcpy(sex,a);
void settype(char *a)strcpy(type,a);
void setdated(int a,int b,int c)dd.datedyear=a;dd.datedmonth=b;dd.datedday=c;
void printemployee();
virtual void computeSalay()=0;
;

class manager:public employee

public:
manager()cout<<"123456";
void computeSalay()cout<<"工资:"<<wage;
private:
float wage;
;

employee::employee(int a,char b[10],char c[2],char d[10])

mno=a;
strcpy(name,b);
strcpy(sex,c);
strcpy(type,d);


void employee::printemployee()

cout<<"编号:"<<mno<<endl;
cout<<"姓名"<<name<<endl;
cout<<"性别"<<sex<<endl;
cout<<"出生年月"<<getdated()<<endl;
cout<<"类别"<<type<<endl;


int main()
int p;
manager a;
char *b;//b没有分空间下面就赋值??
strcpy(b,a.getname()); //<-------执行到这里出错
cout<<b;
system("pause");
return 0;//int型没有返回值
参考技术B char *b;//没有申请内存
strcpy(b,a.getname());
参考技术C test

将字符串值传递给实现文件的 C++ 问题

【中文标题】将字符串值传递给实现文件的 C++ 问题【英文标题】:C++ Issue passing String value to Implementation file 【发布时间】:2018-01-20 03:06:54 【问题描述】:

家庭作业有问题。 C++ 不是我最好的语言,我在课堂上苦苦挣扎,尤其是在课堂的概念上。我想我大部分时间已经完成了分配的代码,但是我在将字符串 romanString2 从主文件传递到实现文件时遇到了困难,因此它达到了 void romanType::romanToPositiveInteger() 。以下是我当前的代码。我会很感激帮助指出什么是错的。

main.cpp //主程序

#include <iostream>
#include <string>
#include "roman.h" 

using namespace std;

int main()

    romanType roman;

    string romanString2;

    cout << "Enter a roman number: ";
    cin >> romanString2;
    cout << endl;
     roman.setRoman(romanString2);

    cout << "The equivalent of the Roman numeral "
         << romanString2 << " is ";
    roman.printPositiveInteger();
   // cout << numResult;
    cout << endl;

    return 0;

roman.cpp //罗马数字实现文件

#include <iostream> 
#include <string>
#include "roman.h"

using namespace std;

// part c
void romanType::printPositiveInteger() const  
cout << num; 


// part c
void romanType::printRoman() const 
cout << romanNum;


// part a
void romanType::setRoman(string rString) 
    romanNum = rString;
     romanToPositiveInteger(); 


// part b
void romanType::romanToPositiveInteger() 

    int numResult;
    string romanString;
    numResult = 0;

   cout << romanString;
    if (romanString.find("MMM") != std::string::npos) 
   numResult = numResult + 3000;
else if (romanString.find("MM") != std::string::npos)
         numResult = numResult + 2000;
    else if (romanString.find("M") != std::string::npos and romanString.find("CM") == std::string::npos)

         numResult = numResult + 1000;
    else

    
    if (romanString.find("CM") != std::string::npos)
        numResult = numResult + 900;
        cout << "CM";
    
       if (romanString.find("D") != std::string::npos and romanString.find("CD") == std::string::npos) 
   numResult = numResult + 500;


     if (romanString.find("CD") != std::string::npos)
        numResult = numResult + 400;
    

           if (romanString.find("C") != std::string::npos and romanString.find("CD") == std::string::npos and romanString.find("CC") == std::string::npos  and romanString.find("CCC") == std::string::npos and romanString.find("CM") == std::string::npos  ) 
   numResult = numResult + 100;

        if (romanString.find("CCC") != std::string::npos) 
   numResult = numResult + 300;
else if (romanString.find("CC") != std::string::npos)
         numResult = numResult + 200;
    

              if (romanString.find("L") != std::string::npos and romanString.find("LC") == std::string::npos) 
   numResult = numResult + 50;

    if(romanString.find("XL") != std::string::npos) 
   numResult = numResult + 40;

        if (romanString.find("XXX") != std::string::npos) 
   numResult = numResult + 30;
else if (romanString.find("XX") != std::string::npos)
         numResult = numResult + 20;
    else if (romanString.find("X") != std::string::npos and romanString.find("IX") == std::string::npos)

         numResult = numResult + 10;
    else

     
      if (romanString.find("IX") != std::string::npos)
        numResult = numResult + 9;
     
      if (romanString.find("V") != std::string::npos and romanString.find("IV") == std::string::npos )
        numResult = numResult + 5;
     
        if (romanString.find("III") != std::string::npos) 
   numResult = numResult + 3;
else if (romanString.find("II") != std::string::npos)
         numResult = numResult + 2;
    else if (romanString.find("I") != std::string::npos and romanString.find("IV") == std::string::npos)

         numResult = numResult + 1;
    else

    
      if (romanString.find("IV") != std::string::npos)
        numResult = numResult + 4;
     
    cout << numResult;
     num = numResult;


romanType::romanType()  
romanNum ='I';
    num='1';



romanType::romanType(string rString)  
    romanNum = rString;
     romanToPositiveInteger();

roman.h

#include <string> 
using namespace std;

class romanType

public:
    void setRoman(string);
    void romanToPositiveInteger();
    void printPositiveInteger() const;
    void printRoman() const;
    romanType();
    romanType(string);


private:
    string romanNum;
    int num;
;

【问题讨论】:

【参考方案1】:

我注意到一个错误:

你正在使用

void romanType::romanToPositiveInteger() 

    int numResult;
    string romanString;
    numResult = 0;

并继续假设romanString 包含罗马数字的字符串表示。

该信息存储在成员变量romanNum 中。在函数中将romanString的用法改为romanNum,并完全删除变量romanString

【讨论】:

谢谢,我现在可以使用了。我觉得这是显而易见的事情,但我对此感到非常沮丧,即使它开始闪烁红色,我也可能不会注意到错误。【参考方案2】:

您将字符串存储在变量 romanNum 中,但在 romanToPositive 函数中,您使用的是本地字符串变量 romanString 而不是 romanNum 变量。这就是您没有看到所需输出的原因

【讨论】:

以上是关于C++字符串的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中将数字转换为字符串,反之亦然

使用 C++ 拆分字符串 [重复]

C与C++风格的字符串辨析

如何在 C++ 中标记字符串?

在 C++ 中拆分字符串的最佳实践

字符串 C++ 的问题