如何打印字符串位置以及如何替换字符串但跳过一些字符串将C语言应用于Arduino



示例:"我有一支钢笔。我有一个菠萝。嗯菠萝皮。钢笔菠萝苹果钢笔">

Q1:请打印出例句中单词笔的位置将C语言应用于Arduino

Q2:在例句中,所有的单词"笔;变为";苹果;[注]:不包括pineapplepen的钢笔请解释代码将C语言应用于Arduino

我的朋友是通过C#实现的,但我不知道如何将C语言应用于Arduino

//by C#
using System;
using System.Text.RegularExpressions;
class HelloWorld {
static void Main() {
var source = "I have a pen.I have a pineapple. Uh..pineapplepen. pen pineapple apple pen.";
String target= "pen";
Regex regex= new Regex("(^|[\s.,])("+ target + ")(?=[\s.,])");
foreach(Match match in regex.Matches(source)) {
Console.WriteLine(match.Index+match.Groups[1].Length);
}
var result= regex.Replace(source,x=>x.Groups[1]+"apple");

Console.WriteLine(result);
Console.ReadLine();
}
}

在示例句子中,所有单词"笔;变为";苹果;[注]:不包括菠萝皮笔。

2个问题出现,"apple""pen"长,因此更改意味着形成比原始字符串长的字符串。我们需要一个新的空间来形成结果。

"不包括pineapplepen笔";意味着我们需要定义单词的概念,可能是
[beginning or whitespace]pen[end or whitespace]


考虑两次通过的解决方案,第一次确定所需的大小,第二次进行替换。

OP的一些未经测试的代码,以了解如何实现各种问题。

// Look for a needle in a haystack
// Replace when found, form result in dest (when not NULL)
// Return string length
size_t sub(char *dest, const char *haystack, const char *needle, const char *replace) {
size_t needle_len = strlen(needle);
size_t replace_len = strlen(replace);
if (needle_len == 0) {
TBD_Code();  // Handle pathological case
}
bool beginning_of_word = true;
size_t dest_i = 0;

// Walk the haystack
for (size_t i = 0; haystack[i]; ) {
if (beginning_of_word && memcmp(&haystack[i], needle, needle_len) == 0) {
unsigned char end = haystack[i + needle_len];
if (isspace(end) || end) {
if (dest) {
strcpy(dest + dest_i, replace);
}
dest_i += replace_len;
i += needle_len;
beginning_of_word = false;
continue;
}
}
unsigned char ch = haystack[i];
beginning_of_word = isspace(ch);
if (dest) {
dest[dest_i] = ch;
}
dest_i++;
i++;
}
if (dest) {
dest[dest_i] = 0;
}
return dest_i;
}

使用

const char *example = "I have a pen.I have a pineapple. Uh..pineapplepen. pen pineapple apple pen.";
size_t len = sub(NULL, example, "pen", "apple");
char dest[len + 1];
sub(dest, example, "pen", "apple");
puts(dest);

基本的复杂性是C不像其他语言那样具有组合的字符串/内存分配例程。所以我们需要用用户代码来处理这种管理。

最新更新