从字符中提取“ \ r”之前的所有字符*

时间:2019-07-13 11:26:23

标签: c++ string

我正在尝试从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;

完成我想做的事情的正确方法是什么?

3 个答案:

答案 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;
}