1

所以我有一个字符 *. 我想在最后剪掉一些。所以

char *sentence = "My name is Ted";

我如何切断泰德。我可以将其设为字符串,然后使用子字符串(来自 Java,这就是我的 go to 方法),但 id 而不是那样做。但我不确定如何使用 char *.

编辑:进一步的问题。问题出在一个接受进程的函数中,该函数旨在返回该进程启动时的位置。那很好,我可以得到。但是参数 char *procLocation 是通过引用传递的,因此位置将被发送回那里。

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

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

返回错误:错误 C2440: '=' : cannot convert from 'const char *' to 'char *'

4

4 回答 4

10

由于这是一个字符串文字,因此您无法修改它。

如果你这样做了:

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

您可以简单地将之前的字符设置Ted\0

不过,您可能会更好std::string

于 2012-04-27T10:28:33.243 回答
5

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

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

这打印Hello, T

这种方法比制作 astd::string和获取子字符串更浪费。

于 2012-04-27T10:35:43.020 回答
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

请参阅这篇文章了解为什么这更好的实际原因。它还给出了为什么不修改此类右值字符串的原因。

于 2012-04-27T10:58:56.347 回答
0

您已经标记了问题 'c++' 和 'string' 但您说您不想使用stringand来执行此操作substr?不知道为什么会这样。您应该尽可能喜欢这些而不是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);
于 2012-04-27T11:53:24.713 回答