所以我有一个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 *'
答案 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;但是你说你不想用string
和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);