查找并替换数组的特定元素

时间:2017-05-03 17:22:06

标签: c++ arrays string while-loop

我试图在阵列Bob中找到“空”,然后在我找到索引中的空白之后我想用“LEEROY JENKINS”替换“空”这个词请原谅我缺乏知识我仍然很新手,并尽我所能学习。

问题:

  1. int spindex()找不到正确的索引
  2. 空未被替换
  3. <?xml version="1.0"?>
    <package>
      <metadata>
        <id>$rootnamespace$</id>
        <version>$version$</version>
        <title>$rootnamespace$</title>
        <authors>$author$</authors>
        <!--<iconUrl></iconUrl>-->
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>$rootnamespace$</description>
        <copyright>$copyright$</copyright>
        <tags></tags>
      </metadata>
    </package>
    

2 个答案:

答案 0 :(得分:2)

问题在于你构建循环的方式:

while (x[i] != "empty" && i < n)
{
    tindex = i;
    i++;
}

首先,i为0. tindex设置为0,i设置为1。

然后循环重复,检查条件。哎呀! x [1]是&#34;空&#34;!循环结束,tindex仍为0。

这就是为什么Q为0以及为什么错误的元素被替换的原因。

此外,您在尝试使用i < n(哎呀)之后检查x[i]

您也可以返回i,因为这已经是您需要的值:

int spindex(string x[], int n)
{
    int i = 0;

    while (i < n && x[i] != "empty") {
        i++;
    }

    return i;
}

live demo

在我看来,整个问题会更好地构建:

#include <string>
#include <algorithm>
#include <iostream>

int main()
{
    std::string Bob[] = { "shaun", "empty", "tom", "empty", "chris", "sharon", "empty"};

    auto it = std::find(std::begin(Bob), std::end(Bob), "empty");
    if (it == std::end(Bob)) {
        // No "empty" to replace!
        return EXIT_FAILURE;
    }

    // Replace first "empty" with "BOB"
    *it = "BOB";

    // Here is our array now
    std::cout << '[';
    for (const auto el : Bob)
        std::cout << el << ',';
    std::cout << ']' << '\n';
}

// Output: [shaun,BOB,tom,empty,chris,sharon,empty,]

(live demo

答案 1 :(得分:2)

此功能

int spindex(string x[], int n)

{
    int i = 0;
    int tindex;

    while (x[i] != "empty" && i < n)
    {
        tindex = i;
        i++;
    }
    return tindex;
}

错了。除非数组的第一个元素具有值"empty",否则该函数将返回包含该字符串的元素的索引之前的索引。

同样,while循环条件中子条件的顺序也是错误的。

按以下方式编写

size_t spindex( const std::string a[], size_t n )
{
    size_t i = 0;

    while ( i < n  && a[i] != "empty" ) i++;

    return i;
}

并将其称为

size_t Q = spindex( Bob, sizeof( Bob ) / sizeof( *Bob ) );

编写函数的更通用的方法看起来如下

size_t spindex( const std::string a[], size_t n, const std::string &s )
{
    size_t i = 0;

    while ( i < n  && a[i] != s ) i++;

    return i;
}

它可以被称为

size_t Q = spindex( Bob, sizeof( Bob ) / sizeof( *Bob ), "empty" );

作为替代方案,您可以使用标头std::find中声明的标准算法<algorithm>