切断焦炭的结尾*

时间:2012-04-27 10:26:27

标签: c++ string

所以我有一个char *。我想在最后切断一些。所以

char *sentence = "My name is Ted";

如何切断泰德。我可以把它变成一个字符串,然后使用子字符串(来自Java,这就是我去的方法)但是id而不是那样做。但我不知道如何使用char *。

编辑:进一步解决这个问题。问题出在一个函数中,它接受一个进程并且意味着在该进程启动时返回该位置。多数民众赞成我可以得到它。但是参数char * procLocation是通过引用传递的,因此该位置将被发送回那里。

我只能获取包含流程名称的位置。我想切断流程的名称,只返回位置。我已经尝试将该位置设为字符串并执行子字符串(字符串 - processName的长度)。没关系。但是

procLocation = location.c_str(); // where location.substr is the location - the process name

给出错误:错误C2440:'=':无法从'const char *'转换为'char *'

4 个答案:

答案 0 :(得分:10)

由于这是一个字符串文字,因此无法对其进行修改。

如果你这样做了:

char sentence[] = "My name is Ted";

您只需将Ted之前的字符设置为\0

尽管使用std::string可能会更好。

答案 1 :(得分:5)

您可以使用std::string构造函数来复制比char*中可用字符少的字符,而不是切断文字:

const char *data = "Hello, Ted!";
string s(data, data+8);
cout << s << endl;

这会打印Hello, T

这种方法比制作std::string并使用子字符串更少浪费。

答案 2 :(得分:2)

对于你原来的问题,因为你是来自Java,你应该(应该RFC2119意义上)肯定使用std::string

#include <string>
#include <iostream>
using namespace std;

int main(int argc, const char** argv) {
    // copy c-string to std::string
    string arg0 = argv[0];
    cout << arg0 << endl;
    // find last occurrence of path separator
    size_t found = arg0.find_last_of("/\\");
    // split off filename part of string
    cout << arg0.substr(0,found) << endl;
    return 0;
}

此外,您不应该(在RFC2119的意义上不应该)将char数组声明为char指针,而应该声明为char数组:

char[] s0 = "Hello World!"; // <-- is better
char * s1 = "Hello World!"; // <-- avoid this

请参阅this post了解为何更好的原因。它还说明了为什么不修改这样的右值字符串的原因。

答案 3 :(得分:0)

您已经标记了问题&#39; c ++&#39;和&#39;字符串&#39;但是你说你不想用stringsubstr来做这件事吗?不知道为什么会这样。只要有可能,应该更喜欢这些char*和C样式的字符串操作函数。

用C ++方式做到:

string sentence = "My name is Ted";

cout << "\"" << sentence.substr(0, sentence.rfind(' ') ) << "\"" << endl;

虽然你可以(稍微修改你的代码,以便你有一个可变的字符串),但在C:

中这样做
char sentence[] = "My name is Ted";
*strrchr(sentence, ' ') = '\0';

printf("\"%s\"\n", sentence);