C连接字符串问题

Posted

tags:

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

char *trans(int num)

char *p,*tem;
if(num==0) p="zero";
if(num==1) p="one";
if(num==2) p="two";
if(num==3) p="three";
if(num==4) p="four";
if(num==5) p="five";
if(num==6) p="six";
if(num==7) p="seven";
if(num==8) p="eight";
if(num==9) p="nine";
if(num==10) p="ten";
if(num==11) p="eleven";
if(num==12) p="twelve";
if(num==13) p="thirteen";
if(num==14) p="fourteen";
if(num==15) p="fifteen";
if(num==16) p="sixteen";
if(num==17) p="seventeen";
if(num==18) p="eighteen";
if(num==19) p="nineteen";
if(num==20) p="twenty";
if(num>20&&num<30) p="twenty ";tem=trans(num%10);strcat(p,tem);
return p;

主函数调用trans(21)。应该返回“twenty one",为啥这个代码会出错?请帮忙给出正确结果并指出错误,尽量使用指针。

你需要使用malloc函数来申请一段空间,或者用string也可以。

其次,C语言字符串的赋值需要用strcpy函数,不能用'='。

char *trans(int num)

    //char *p,*tem;你这只是声明了两个字符指针,而非两个字符串 
    char *p=(char*)malloc(30);
    char *tem;//tmp的声明由后面递归执行 
    if(num==0) strcpy(p,"zero");
    if(num==1) strcpy(p,"one");
    if(num==2) strcpy(p,"two");
    if(num==3) strcpy(p,"three");
    if(num==4) strcpy(p,"four");
    if(num==5) strcpy(p,"five");
    if(num==6) strcpy(p,"six");
    if(num==7) strcpy(p,"seven");
    if(num==8) strcpy(p,"eight");
    if(num==9) strcpy(p,"nine");
    if(num==10) strcpy(p,"ten");
    if(num==11) strcpy(p,"eleven");
    if(num==12) strcpy(p,"twelve");
    if(num==13) strcpy(p,"thirteen");
    if(num==14) strcpy(p,"fourteen");
    if(num==15) strcpy(p,"fifteen");
    if(num==16) strcpy(p,"sixteen");
    if(num==17) strcpy(p,"seventeen");
    if(num==18) strcpy(p,"eighteen");
    if(num==19) strcpy(p,"nineteen");
    if(num==20) strcpy(p,"twenty");
    if(num>20&&num<30)
    
        strcpy(p,"twenty ");
        tem=trans(num%10);
        strcat(p,tem);
        free(tem);//使用完毕后释放 
    
    return p;

参考技术A char *p;  //只是给变量p分配了一个内存单元来存储其指针地址, 并没有分配一段内存单元来存储字符串

C ++ int到字符串,连接字符串[重复]

【中文标题】C ++ int到字符串,连接字符串[重复]【英文标题】:C++ int to string, concatenate strings [duplicate] 【发布时间】:2013-09-14 14:45:05 【问题描述】:

我是 C++ 新手,正在从事一个简单的项目。基本上我遇到问题的地方是创建一个文件名中带有数字(int)的文件。如我所见,我必须首先将 int 转换为字符串(或 char 数组),然后将这个新字符串与文件名的其余部分连接起来。

这是我目前无法编译的代码:

int n; //int to include in filename
char buffer [33];
itoa(n, buffer, 10);
string nStr = string(buffer);

ofstream resultsFile;
resultsFile.open(string("File - ") + nStr + string(".txt"));

这会产生一些编译错误(在 Linux 中编译):

    itoa 未在此范围内声明 没有匹配函数调用“std::basic_ofstream char, std::char_traits char ::open(std::basic_string char, std::char_traits char , std::allocator char)”

我已经尝试过这里的建议:c string and int concatenation 在这里:Easiest way to convert int to string in C++ 没有运气。

如果我使用 to_string 方法,我会得到错误“to_string not a member of std”。

【问题讨论】:

如果你买得起 C++11,一个更简单的将整数转换为字符串的方法是使用std::to_string。例如,请参阅我的答案。 【参考方案1】:

您可以使用stringstream 来构造文件名。

std::ostringstream filename;
filename << "File - " << n << ".txt";
resultsFile.open(filename.str().c_str());

【讨论】:

这看起来很有希望。但是,当我编译代码时,出现错误:“聚合‘std::ostringstream 文件名’类型不完整,无法定义” 我不认识那个错误。你需要在源文件的顶部#include &lt;sstream&gt;【参考方案2】:

对于itoa,您可能缺少#include &lt;stdlib.h&gt;。请注意itoa 是非标准的:将整数格式化为字符串的标准方法为sprintfstd::ostringstream

ofstream.open() 采用 const char*,而不是 std::string。使用.c_str()方法从后者获取前者。

把它放在一起,你正在寻找这样的东西:

ostringstream nameStream;
nameStream << "File - " << n << ".txt";
ofstream resultsFile(nameStream.str().c_str());

【讨论】:

【参考方案3】:

您想使用boost::lexical_cast。您还需要包含任何需要的标题:

#include <boost/lexical_cast>
#include <string>
std::string nStr = boost::lexical_cast<std::string>(n);

那么简单:

std::string file_name = "File-" + nStr + ".txt";

因为std::strng 可以很好地处理字符串文字(例如“.txt”)。

【讨论】:

或者,如果您没有,请使用字符串流。【参考方案4】:

使用std::ostringstream:

std::ostringstream os;
os << "File - "  << nStr << ".txt";
std::ofstream resultsFile(os.str().c_str());

使用std::to_string (C++11):

std::string filename = "File - " + std::to_string(nStr) + ".txt";
std::ofstream resultsFile(filename.c_str());

【讨论】:

【参考方案5】:

对于itoa函数

include <stdlib.h>

考虑这个链接

http://www.cplusplus.com/reference/cstdlib/itoa/

【讨论】:

#include,不包括。【参考方案6】:

您可以使用std::stringstream

std::stringstream ss;
ss << "File - " << n << ".txt";

由于构造函数需要一个 char 指针,因此您需要使用将其转换为 char 指针

ofstream resultsFile(ss.str().c_str());

【讨论】:

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

C/C++ 宏字符串连接

C连接字符串问题

C语言:将两个字符串连接起来。

连接字符串文字上的 c_str() 是不是安全?

C ++中的基本字符串连接未正确输出[关闭]

包含由 C/C++ 宏连接生成的字符串 [重复]