2012-02-09 3 views
4

У меня есть массив символов, который содержит некоторое значение. Я хочу скопировать значение из этого массива из некоторого случайного индекса в некоторый другой случайный индекс. Как я могу это сделать ?Копирование из произвольной позиции Внутри массива на другой массив

  #include<iostream.h> 
     using namespace std; 

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

В настоящее время ar array содержит строку, которая является странной. Предположим, я хочу создать еще один массив символов 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. 

Поэтому вам необходимо обнулить завершить строку вручную:

dest[nos_of_chars] = '\0'; 

UPDATE

Вы можете использовать что-то вроде этого:

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++, не используйте строки полукокса для обработки вместо этого использовать класс строк.

+1

, который не берет с 7-10, который принимает 10 символов из позиции 7, поэтому это 7-17. –

+0

исправлена ​​ошибка. – phoxis

1

Чтобы скопировать n символов, начиная с позиции p от string1 до string2, вы можете использовать:

strncpy(string2, string1 + p, n); 

Если вы имеете дело со строками C++ (std::string), то вы можете использовать функцию 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; 
} 
Смежные вопросы