строка целых чисел в Си
Здравствуйте. Подскажите, как преобразовать строку вида:
char str[]=»12 34 56 78″;
в массив целых чисел:
int arr[n];
***
arr[0]=12
arr[1]=34
.
Длина строки неизвестна. Заранее спасибо.
anonymous
21.12.03 20:17:46 MSK
Re: строка целых чисел в Си
#include int* strstoi(char* str, int* nnum) < int* t = NULL; int rc, num, n = 1; while ((rc = sscanf(str, "%d", &num)) >0) < t = realloc(t, sizeof(int)*n); t[n++-1] = num; while (isdigit(*str)) str++; while (isspace(*str)) str++; >*nnum = n-1; return t; > int main()
Murr ★★
( 21.12.03 21:33:27 MSK )
Ответ на: Re: строка целых чисел в Си от Murr 21.12.03 21:33:27 MSK
Re: Re: строка целых чисел в Си
main()
<
char *b = «123 0x7 0777 -256 «;
int *t = NULL, n, i;
char *s;
for(n=0;; b = s) < // b - changed
long l = strtol(b, &s, 0); // You can use 10, see man
if(b==s) break;
t = realloc(t, sizeof(int)*(n+1));
t[n++] = l;
>
for(i=0; i printf(«t[%d] = %d\n», i, t[i]);
>
io ★★
( 22.12.03 00:08:35 MSK )
Ответ на: Re: строка целых чисел в Си от Murr 21.12.03 21:33:27 MSK

Re: Re: строка целых чисел в Си
realloc медленный, по мне лучше посчитать кол-во пробелов и выделить сразу соответствующий кусок памяти, во первых если памяти не хватит мы об этом сразу узнаем а во вторых не будет постоянно переливать данные из пустого в порожнее
lg ★★
( 22.12.03 09:20:49 MSK )
Ответ на: Re: строка целых чисел в Си от Murr 21.12.03 21:33:27 MSK
Re: Re: строка целых чисел в Си
Огромное спасибо, очень помогли.
anonymous
( 22.12.03 11:52:17 MSK )
Ответ на: Re: Re: строка целых чисел в Си от anonymous 22.12.03 11:52:17 MSK
Re: Re: Re: строка целых чисел в Си
Гы. А потом выяснитс я, что пробелов между числами — произвольное кол-во , а кроме того — там же будут и табы всех видов и проч. херня. Зачем велосипед-то изобретать? sscanf все это умеет делать, причем гораздо качественнее.
Flogger_d ★
( 22.12.03 12:23:33 MSK )
Ответ на: Re: Re: Re: строка целых чисел в Си от Flogger_d 22.12.03 12:23:33 MSK
Re: Re: Re: Re: строка целых чисел в Си
Так что — первый вариант более правильный. Единственное НО. Перед запуском цикла неплохо бы отпозиционироваться на начало числа — ведь не факт, что строка начинается не с пробелов. Далее — по тексту возражений нет.
Flogger_d ★
( 22.12.03 12:28:29 MSK )
Ответ на: Re: Re: Re: строка целых чисел в Си от Flogger_d 22.12.03 12:23:33 MSK

Re: Re: Re: Re: строка целых чисел в Си
ну каждому свое . если в строке хотя бы 100000 таких чисел то все умрет .. перегнать 20Tb это вам не быстрое занятие .. и еще в момент realloca() потребуется в _два_ раза больше памяти чем реально нужно .. и в конце концов когда ты прождешь три часа пока все это отработает realloc вывалится с ошибкой типа не хватает памяти батенька .. нет уж, по мне лучше написать минипарсер(даже не парсер .. две строки)
lg ★★
( 22.12.03 15:07:10 MSK )
Ответ на: Re: Re: Re: Re: строка целых чисел в Си от lg 22.12.03 15:07:10 MSK
Re: Re: Re: Re: Re: строка целых чисел в Си
Ну, батенька — не надо передергивать. Когда такими объемами кидаются,
то речь явно не идет о массивах — как о непрерывных кусках памяти. В
вашем случае будет использован связный список и все неприятности с
реаллоком пропадут сами собой. Так что.
Как преобразовать строку в массив js?
Помимо вышеупомянутых способов преобразования строки в массив, есть ещё один метод, которым можно воспользоваться.
Это Array.from():
Данный метод работает очень просто. Вся его работа описана в примере ниже:
const stringOfNumbers = '1234'; const numbers = Array.from(stringOfNumbers); console.log(numbers); // => ['1', '2', '3', '4'] - элементы массива - строки
У данного метода есть особенность, которая может показаться недостатком.
Если в строке между словами, буквами или цифрами будут знаки препинания либо пробелы, они также станут элементами массива.
const stringOfNumbers = '1 2.3,4'; const numbers = Array.from(stringOfNumbers); console.log(numbers); // => ['1', ' ', '2', '.', '3', ',', '4']
27 октября 2021
Для того, чтобы преобразовать строку в массив, нужно сначала определить, по какому критерию строка будет разбиваться на элементы. Например, строку можно разбить на подстроки, между которыми встречается разделитель:
const str = 'мама мыла раму'; // исходная строка const result = str.split(' '); // используем метод split с указанием разделителя // ['мама', 'мыла', 'раму']
В примере выше использовался метод split для разделения строк на элементы по определенному разделителю. Если указать в качестве разделителя пустую строку, то на выходе получим массив из символов:
// вызываем метод на строке и выводим результат console.log('test'.split('')); // => ['t', 'e', 's', 't']
Также строки имеют некоторые свойства массивов: их можно перебирать в циклах а также можно обращаться к символам через индексы:
// перебираем строку в цикле for (const symbol of 'test') console.log(symbol); > // обращение по индексу console.log('test'[1]); // => 'e'
Есть также быстрый способ разбить строку на символы с использованием рест-оператора:
const result = [. 'hello']; // ['h', 'e', 'l', 'l', 'o']; result.forEach((item) => console.log(item));
Как перевести string в массив integer в с++?
Решение в духе stl (вектор вместо сырого массива):
#include #include #include #include #include #include using namespace std; int main() < string s = "74 319 432 82 95 0 1"; stringstream ss(s); vectorv; copy(istream_iterator(ss), <>, back_inserter(v)); copy(begin(v), end(v), ostream_iterator(cout, " ")); >
Отслеживать
ответ дан 28 фев 2016 в 19:43
28.8k 12 12 золотых знаков 59 59 серебряных знаков 118 118 бронзовых знаков
Плюсанул @alexolut, но решил предложить:
Решение с частичкой духа stl (вектор вместо сырого массива, но без stringstream):
#include #include #include #include #include #include using namespace std; int main() < string s = "74 319 432 82 95 0 1"; vectorv; auto ptr = s.c_str(); char *endptr = nullptr; while (ptr != s.c_str() + s.size()) < auto value = strtol(ptr, &endptr, 10); if (ptr == endptr) < ptr++; >else < ptr = endptr; v.push_back(value); >> copy(begin(v), end(v), ostream_iterator(cout, " ")); >
if (ptr == endptr)
нужна, что бы пропустить невалидный символ и не зациклиться (попробуем следующий). При таком раскладе подобный вход:
string s = "f74 319 a432 82 95 0 1";
тоже будет обработан: всё, не числовое будет отброшено.
Стоит ещё проверять errno на ERANGE , и пытаться применять, например, strtoll()
Статья c# Как преобразовать строку в массив?
В этой статье хочу показать несколько простых способов, с помощью которых можно преобразовать строку в массив.
Так как любая строка в языке c# представляет собой набор символов, то для того, чтобы из строки получить массив нужно всего лишь воспользоваться обычным циклом for, например:
string str = @"массив"char [] ar = new char [str.Length]; for(int i = 0; i
Второй способ позволяет преобразовать строку в массив буквально в одну строчку кода. Для этого всего лишь нужно воспользуемся уже готовым методом ToCharArray, например:
string str = @"мама мыла раму"; char [] ar = str.ToCharArray();
Третий способ, очень похож на предыдущий, единственное его отличие в том, что преобразование строки выполняется с помощью метода расширения ToArray, в результате так же получаем массив.
string str = @"язык c#"; char [] ar = str.ToArray();
- Как создать dll библиотеку?
- Создание контекстного меню в программе Visual Studio
- Как установить MySQL for Visual Studio?