2012-02-03 3 views
2

Мне нужно разбить строку на несколько строк. На самом деле мне нужно проанализировать некоторые данные из файла, который находится в следующем формате (i9, i9, i2), например.Разбор строки в несколько строк

i9 означает десятичное число как: (5blankspaces) 4567

Так мне нужно получить, что номера должным образом. Ширина всегда фиксируется, поэтому каждое число должно подчиняться этому. Правильный экземпляр этого формата будет

(5spaces) 4567 (6spaces) 453 (1space) 2 или (5spaces) 4567 (6spaces) 45322 (где 22 является аргументом для i2 в данном случае)

Белые пробелы перед цифрами дают мне головную боль, поэтому я думал, что могу разделить каждый аргумент на массив символов, а затем преобразовать его в целое число, поскольку спецификатор% d игнорирует все пустое пространство, и я не знаю, как использовать ширину как а также игнорировать пробелы .. (если это можно сделать, я имею в виду, разбор всех целых, пожалуйста, скажите это!)

Если нет .. ну, мне нужна помощь, чтобы разобрать e очень строку в подстроки, до сих пор я сделал это, но это не работает:

while (fgets(buffer, 600, f)) { 
    sscanf(buffer, "%9[^\n]s %9[^\n]s %2[^\n]s", arg1, arg2, arg3); 
    .... 
} 

Пожалуйста, любая помощь будет принята с благодарностью !!!

+5

C или C++? Выбери свою судьбу! :) –

+0

Возможный дубликат [Разбор строки с разделителями-запятой std :: string] (http://stackoverflow.com/questions/1894886/parsing-a-comma-delimited-stdstring) –

+0

Возможный дубликат [Разбор строки в длинном C] (http://stackoverflow.com/questions/7930167/parsing-string-to-long-in-c) –

ответ

3

Этот ответ C. Именно поэтому я использовал имя переменной new.

Использовать strncpy()и соответствующим образом завершить результат.

char part1[10], part2[10], part3[3]; 
const char *new = "  4567  45322\n"; /* the line read */ 

strncpy(part1, new, 9); part1[9] = 0; 
strncpy(part2, new+9, 9); part2[9] = 0; 
strncpy(part3, new+18, 2); part3[2] = 0; 

Предлагаю вам не пытаться писать многоязычные исходные файлы.

+3

Ха-ха, 'new' как переменное имя - отличный способ опрокинуть всех этих жертв Microsoft:) –

+0

Любят соглашение об именах – dalle

+0

Спасибо всем за ответы !! все работает нормально, за исключением следующего случая: (2spaces) 137411365101 (3spaces) 0,93 Реальный формат i7 i7 f7, но когда он анализирует 0.93, он сохраняет (пробел) 1 (пробел) 0,93, который является правильным (ширина 7), но это не так, как в файле (как я пишу выше) .., что 1 номер не должен быть там: S, пожалуйста, помогите! – Lucia

2

В C++ использовать substr(), наряду с обычной строки в целое число переходов:

#include <string> 

std::string s = "  1234  78922"; 

std::string s1 = s.substr(0, 9); 
std::string s2 = s.substr(9, 9); 
std::string s3 = s.substr(18); // or substr(18, 2) 

int n1 = std::stoi(s1), n2 = std::stoi(s2), n3 = std::stoi(s3); 

Применить обычные проверки длины в случае необходимости, чтобы подтвердить, что вход действительно находится в правильном формате.

Смежные вопросы