Skip to content

String::replace buggy in certain cases #240

Closed as not planned
Closed as not planned
@rspierce

Description

@rspierce

Description

replacing multiple occurrences of a string with a smaller string only works for an odd number of occurrences

Environment

Boards platform name

"Raspberry Pi Pico/RP2040" boards platform from Earle F. Philhower, III

Boards platform version

Original report

Not specified

Last verified with

4.0.3

Code demonstrating problem

void setup() {
  Serial.begin(9600);
  while (!Serial) {}
  // this code should remove all occurrences of "narf" from the string
  String s = "narf";
  Serial.println();
  Serial.print("input: (");
  Serial.print(s);
  Serial.println(")");
  s.replace("narf", "");
  Serial.print("result: (");
  Serial.print(s);
  Serial.println(")");

  s = "narf narf";
  Serial.println();
  Serial.print("input: (");
  Serial.print(s);
  Serial.println(")");
  s.replace("narf", "");
  Serial.print("result: (");
  Serial.print(s);
  Serial.println(")");
}

void loop() {}

Serial monitor output:

input: (narf)
result: ()

input: (narf narf)
result: (narf narf)

Additional information

In this code:

https://github.com/earlephilhower/ArduinoCore-API/blob/ece6e68f29c6f406a4434659bcbcfe558baaa3a9/api/String.cpp#L667-L671

		while ((foundAt = strstr(readFrom, find.buffer)) != NULL) {
			readFrom = foundAt + find.len;
			diff = 0 - diff;
			size -= diff;
		}

line 669 (diff = 0 - diff;) should be above the while loop.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions