【问题标题】:c how to cut of the first x words of a string?c如何剪切字符串的前x个单词?
【发布时间】:2015-02-19 15:25:31
【问题描述】:

我有一个字符数组:

char tmp[2048];

我想删除 tmp 的前 x 个单词。我将单词定义为不包含空格的字符序列。我试过这样的东西(应该删掉前三个字):

sscanf(tmp, "%*s %*s %*s %s", tmp);

我的问题是,'%s' 在它找到的第一个空格处停止。我希望新字符串在旧字符串的末尾结束,而不是在第一个空格处。

我也愿意接受其他建议如何剪切字符串的前 x 个单词。我将单词定义为不包含空格的字符序列。

【问题讨论】:

  • 您为什么不直接使用std::string,它允许您使用 2 或 3 行代码完成所有这些工作,没有错误、没有内存泄漏和完全的异常安全性?为什么要自己处理原始动态数组?
  • 你的代码中sscanf的返回值是多少? sscanf 返回参数列表中已填充的项目数。
  • 您有什么理由使用sscanf 而不是strcpymemcpy?您似乎使用了错误的工具来完成这项工作。
  • 那使用c++有什么意义呢?确实是错误的工具。
  • 如果“兼容性”是指“与 C 的兼容性”,那么请注意,您也不能使用 newdelete

标签: c


【解决方案1】:

这是一个粗略的实现:

const char* TrimWords(const char* input, int nWords)
{
    while (nWords)
    {
        if (!isspace(*input) && isspace(*(input + 1)))
        {
            nWords--;
        }
        input++;
    }
    return input;
}

TrimWords("One Two Three Four Five", 3);
// returns " Four Five" after the first 3 words are trimmed.

详细的输入验证和错误检查留给 OP。
这只是一个很好的起点。

【讨论】:

  • 嗯,我比我可能的解决方案更喜欢这个。
  • 很好,我对 c 中的 char 数组了解不多,感谢您提供的起点,我将能够根据自己的需要自定义它
  • 会建议改变你的条件来切​​换到下一个单词到'(isspace(*input) && !isspace(*(input + 1)))'
【解决方案2】:

使用 strncpy(tmp, n, tmp+m); 其中 m 和 n 是整数

char tmp[20] = "abcdef";

strncpy(tmp, tmp + 3, 2);

例如:上面的代码将导致 decdef

【讨论】:

  • 让我的问题更清楚了,我想剪掉字符串的前 x 个单词。
【解决方案3】:

您可以使用strtok 通过空格来标记字符串。类似的事情可以做你想要实现的目标:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    // Number of words to trim
    const int numWords = 2;

    char tmp[1024];
    char buffer[1024];
    sprintf(tmp, "this  is a\tsentence.");

    strcpy(buffer, tmp);

    char* token = strtok(buffer, " \t");
    for (int i = 0; i < numWords && token; i++) {
        token = strtok(NULL, " \t");
    }

    if (token) {
        size_t len = 1024 - (token - buffer);
        memmove(tmp, tmp + (token - buffer), len);
    }
    else {
        memset(tmp, '\0', 1024);
    }

    // Prints "a    sentence."
    printf("%s", tmp);
    return 0;
}

但是,strtok 的使用充其量是棘手的。我建议使用类似于abelenky 回答的方法。

【讨论】:

  • 永远,永远不要使用strtokLink
  • @abelenky 有趣;我知道许多危险的 C 函数,但我没有意识到这种特殊性,因为我离 C 很远,更接近 C++。
猜你喜欢
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 2014-08-26
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-30
相关资源
最近更新 更多