从数组中的随机位置复制到另一个数组

时间:2012-02-09 12:49:52

标签: c++

我有一个包含一些值的char数组。我想将该数组中的值从一些随机索引复制到其他一些随机索引。我怎么能这样做?

         #include<iostream.h>
         using namespace std;

         int main()
         {
           char ar[100];
           strcpy(ar,"string is strange");
           cout << ar ;
           return 0;
         }

现在ar数组包含&#34;字符串很奇怪&#34; 。假设我想创建另一个char数组cp,我希望将ar的随机索引位置的值从7复制到10。有一些我们可以使用的字符串函数吗? 我知道我们可以使用strncpy函数,但它从起始索引复制到所提到的字符数。是否有其他功能或strncpy的重载版本 这将使我能够执行相同的操作?

6 个答案:

答案 0 :(得分:2)

这样做

strncpy (dest, ar + 7, 2);

通常

strncpy (destination, source + start_index, number_of_chars);
   The strncpy() function is similar, except that at most n bytes of src are copied.  Warning: If there
   is no null byte among the first n bytes of src, the string placed in dest will  not  be  null-termi‐
   nated.

因此,您需要手动终止字符串:

dest[nos_of_chars] = '\0';

<强>更新

您可以使用以下内容:

char *make_substring (char *src, int start, int end)
{
  int nos_of_chars = end - start + 1;
  char *dest;
  if (nos_of_chars < 0)
  {
    return NULL;
  }
  dest = malloc (sizeof (char) * (nos_of_chars + 1));
  dest[nos_of_chars] = '\0';
  strncpy (dest, src + start, nos_of_chars);
  return dest;
}

当您使用C ++时,请不要使用char字符串进行处理,而是使用字符串类。

答案 1 :(得分:2)

你的代码是用C ++编写的,所以使用STL - 不要创建固定大小的字符数组,使用std :: string。这有一个方法substr(pos,n)。

所以你的代码是:

std::string str;
str = "string is not so strange";
cout << str << endl;
std::string small;
small = str.substr(7, 3);
cout << small << endl;

比使用C api进行潜在的不安全指针算法容易得多。

答案 2 :(得分:1)

要将n个字符从p位置string1复制到string2,您可以使用:

strncpy(string2, string1 + p, n);

如果您正在处理C ++字符串(std::string),那么您可以使用substr成员函数。

std::string string1 = "......";
std::string string2 = string1.substr(p, n);

答案 3 :(得分:1)

C ++

你想要达到什么目的? '字符串很奇怪'让我想起拼写检查 - &gt;排列

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

int main()
{
    std::string s = "string is strange";
    std::sort(s.begin(), s.end());

    while (std::next_permutation(s.begin(), s.end()))
        std::cout << s << "\n";

    return 0;
}

真正只是交换随机位置: http://ideone.com/IzDAj

#include <random>
#include <string>
#include <iostream>

int main()
{
    using namespace std;
    mt19937 random;

    string s = "string is strange";
    uniform_int_distribution<size_t> gen(0,s.size()-1);

    for (int i=0; i<20; i++)
    {
        swap(s[gen(random)], s[gen(random)]);
        cout << s << "\n";
    }

    return 0;
}

答案 4 :(得分:0)

您可以使用例如数据获取数组中特定位置的地址&ar[i]

例如,如果您在return

之前添加以下行
cout << &ar[6] << '\n';

它会打印

is strange

答案 5 :(得分:0)

你可以使用memcpy功能

void * memcpy ( void * destination, const void * source, size_t num );

在你的例子中

memcpy(cp,ar+p,sizeof(char)*n)