Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除字符(以及字符)之后的所有内容_C++_String_Visual C++_Std - Fatal编程技术网

C++ 删除字符(以及字符)之后的所有内容

C++ 删除字符(以及字符)之后的所有内容,c++,string,visual-c++,std,C++,String,Visual C++,Std,我有这样一个字符串: std::string string1 = "xjdfhfakdjs%54k34k.-jk34"; 我只需要得到“xjdfhfakdjs”,但字符串是动态的,不是硬编码的,所以我不知道它是什么,长度等。所以我想删除%之后的所有内容,以及%字符 我该怎么做? std::string the_prefix_you_want = string1.substr(0, string1.find("%")); 请参阅:有关更多详细信息,我相信这会奏效 std::string mys

我有这样一个字符串:

std::string string1 = "xjdfhfakdjs%54k34k.-jk34";
我只需要得到“xjdfhfakdjs”,但字符串是动态的,不是硬编码的,所以我不知道它是什么,长度等。所以我想删除%之后的所有内容,以及%字符

我该怎么做?

std::string the_prefix_you_want = string1.substr(0, string1.find("%"));

请参阅:有关更多详细信息,我相信这会奏效

std::string mystr = string1.substr(0, string1.find("%", 0));

做了一个类似C的东西,它在当前的形式下工作,但肯定比上面显示的方法更笨重:

#include <windows.h>
void main ()
{
    int i;
    wchar_t searchString[100];
    wchar_t * stringReturn;
    memset(searchString, L'\0', sizeof(stringReturn));
    wcscpy_s(searchString, 100, L"String\\ to search");
    stringReturn = wcschr (searchString, '\\');
    if (stringReturn)
    {
        for (i = 0; i < (int)(stringReturn - searchString); i++) stringReturn[i] = searchString[i];
        stringReturn[i] = L'\0';
        wcscpy_s(searchString, 100, stringReturn);
    }
}
#包括
空干管()
{
int i;
wchar_t搜索字符串[100];
wchar_t*stringReturn;
memset(searchString,L'\0',sizeof(stringReturn));
wcscpy_s(searchString,100,L“String\\to search”);
stringReturn=wcschr(搜索字符串“\\”);
如果(返回)
{
对于(i=0;i<(int)(stringReturn-searchString);i++)stringReturn[i]=searchString[i];
stringReturn[i]=L'\0';
wcscpy_s(searchString,100,stringReturn);
}
}

可以很容易地修改以用于动态字符串。

@chris:不,不是。他的复制,你的复制。只是取决于你是否想要一个新字符串(即,如果你仍然想要访问原始字符串)。如果没有,那么chris的答案是好的。我发现使用起来不那么麻烦。复制所花的时间可能并不重要(至少OP没有提到任何内容)。比性能更重要的是,chris的
string1.erase(string1.find(“%”),string1[string1.length()-1]);
,给定空string1,索引
string1[-1]
具有未定义的行为(可能会使应用程序崩溃)。
erase
的第二个参数实际上包含许多字符,其中
npos
sentinel值指示字符串的其余部分,但这是默认值,因此它应该是
string::size\u type n=string1。find(“%”);if(n!=string::npos)string1.擦除(n);
Edward的答案是安全的-如果find返回
npos
substr
返回整个字符串。你试过什么了吗?如果你能说“这是我试过的”,这通常是一个更好的问题(并显示出你的诚意)。