我正在尝试从char *中提取'\ r'字符之前的所有字符。
以下代码似乎不起作用。我原本希望它显示“ java,c ++”,但我只是得到一个空字符串作为输出。
char* testString = "java,c++\r\npython,go\r\n";
char* carriageReturn = strchr(testString, '\r');
*carriageReturn = '\0';
char* firstLine = strdup(testString);
*carriageReturn = '\r';
std::cout << firstLine;
完成我想做的事情的正确方法是什么?
答案 0 :(得分:1)
您要搜索\r
,它是回车符,而不是r
,它只是英文字母中的字母r。
此外,如果有std::string
,为什么还要使用C字符串? C ++是字符串类。
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
string testString = "java,c++\r\npython,go\r\n";
std::string::size_type found = testString.find("\r");
if(found != std::string::npos)
cout << testString.substr(0, found) << endl;
else
cout << "String did not contain any carriage return!" << endl;
return 0;
}
输出:
java,c ++
答案 1 :(得分:0)
如果您不能使用std::string
,而必须使用C字符串,那么您将需要使用cstring
库中提供的函数,并执行一些指针运算,如下所示:
#include <iostream>
#include <cstring>
int main(void)
{
constexpr const char* testString = "java,c++\r\npython,go\r\n";
const char* pch = strchr(testString, '\r');
if(pch != NULL)
{
char substr[pch - testString + 1];
strncpy(substr, testString, pch - testString);
substr[pch - testString] = '\0';
std::cout << substr << std::endl;
}
else
std::cout << "String did not contain any carriage return!\n";
return 0;
}
输出:
java,c ++
在此示例中,您需要手动将NULL终止符附加到字符串中,不要忘记这一点(也不要忘记为该终止符保留内存)。
答案 2 :(得分:0)
您的示例在VS2019上运行良好。只是一些化妆品上的修复:
#include <iostream>
int main()
{
char testString[] = "java,c++\r\npython,go\r\n";
char* carriageReturn = strchr(testString, '\r');
*carriageReturn = '\0';
char* firstLine = _strdup(testString);
*carriageReturn = '\r';
std::cout << firstLine;
}