2012-02-09 10 views
4

私はある値を含むchar配列を持っています。私はその配列からいくつかのランダムなインデックスから他のランダムなインデックスに値をコピーしたいと思います。どうやってやるの ?ランダムな位置から別の配列にコピーする

  #include<iostream.h> 
     using namespace std; 

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

ここで、ar配列に「string is strange」が含まれています。たとえば、別の文字配列cpを作成し、ランダムインデックス位置の値をar、つまり7から10にコピーしたいとします。私たちが使用できる文字列関数がありますか? 私はstrncpy機能を使用できますが、開始インデックスから上記の文字数までコピーします。他の機能やオーバーロードされたバージョンstrncpy がありますか?

+1

宿題?もしそうなら、タグを追加してください。 –

+0

可能な複製http://stackoverflow.com/q/2114377/198011 –

+3

''を使用するコンパイラにアップグレードしたいと考えています。 '.h'は14歳です。 – MSalters

答えて

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. 

のようなので、手動で文字列を終了nullに必要です:

dest[nos_of_chars] = '\0'; 

あなたはこのようなものを使用することができUPDATE

:あなたがC++を使用している場合は

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; 
} 

を、文字列クラスを使用する代わりに、処理のために文字列を使用しないでください。 string2string1からの位置pから始まるn文字をコピーするために

+1

は、位置7から10文字を取っているので、7〜10でないため、7〜17です。 –

+0

このバグは修正されました。 – phoxis

1

は、あなたが使用することができます。

strncpy(string2, string1 + p, n); 

あなたは(std::string)C++文字列を扱っている場合は、あなたがsubstrメンバ関数を使用することができます。

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

たとえば、配列の特定の場所のアドレスを取得することができます。 &ar[i]。例えば

、あなたがreturn

cout << &ar[6] << '\n'; 

の前に次の行を追加する場合、それは

 
is strange 
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を使用して、潜在的に危険なポインタ演算を行うよりもはるかに簡単。

0

あなたはあなたの例ではmemcopy機能

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

を使用することができます

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

あなたが達成しようとしているどのようなC++

? '文字列が奇妙である' スペルチェックを思い出させる - >順列

#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; 
} 
関連する問題