2015-04-02 2 views
0

В настоящее время я следую книге C, и я не могу решить одно упражнение. Учитывая, что я трачу более 1 дня на данный момент, мне нужна помощь/идеи.Как я могу получить часть строки с помощью функции sscanf()?

«Предположим, что ул является строка, которая содержит„продаж звание“сразу предшествует символ # (другие символы могут предшествовать # и/или следовать ранг продаж). Продаж ранга серия десятичных цифр возможно содержащие запятых, например, следующие примеры:

989 
24,675 
1,162,620 

Написать вызов sscanf, который извлекает ранг продаж (но не # символ) и сохраняет его в переменной строку с именем sales_rank «.

То, что я понимаю, что это необходимо:

, например, если мы имеем:

 char *str = "ana are mer2,1#3lala"; 

sales_ranks должно быть: "2,1"

в случае:

 char *str = "ana ar#e mer2,1a3lala"; 

sales_ranks - пустая строка.

Я нашел здесь (http://cboard.cprogramming.com/c-programming/149330-getting-part-string-sscanf.html) несколько полезных сведений, но это неправильное решение. Они интерпретировали упражнение в неправильном подходе, как это:

 char *str = "ana are mer2,1#3lala"; 

sales_ranks является «3», который в порядке, но не то, что по просьбе автора: «продаж ранга» непосредственно предшествует символ #

EDITED :

Я неправильно понял, кто кому предшествует. : | (Таким образом, решение подвергается в ссылке ОК)

На самом деле я провожу все это время, чтобы найти решение для такого рода шаблон: «{десятичного} #» :)

но можно и так? Я имею в виду, если это возможно, что: символ # немедленно предшествует «продажи ранга»

+1

Я думаю, что если ранжированию продаж сразу предшествует символ #, то в «2,1 # 3» ранга продаж 3 – Jack

+0

Yup, если рангу предшествует #, это означает, что рейтинг продаж появляется после # , не раньше, чем. – teppic

+0

hmmm Итак, я неправильно понял, что шаблон должен быть « #». На самом деле это должно быть «# »:? – valicfu

ответ

1

Вы можете использовать sscanf с %[] и %* синтаксисами для достижения этой цели:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    char sales_rank[200]; 
    char *str; 

    sales_rank[0] = 0; 
    str = "ana are mer2,1#3lala"; 

    sscanf(str, "%*[^#]#%199[0-9,]", sales_rank); 
    printf("sales_rank=%s\n", sales_rank); 

    return 0; 
} 

%*[^#] пропустит символы перед #, игнорируя их, а %199[0-9,] сохранит строку sales_rank в переменной. Процесс сопоставления прекратится после чтения sales_rank. Любые дополнительные символы будут проигнорированы.

+0

** пропустить ** несколько неправильно. '% * [^ #]' будет ** соответствовать ** всем символам, кроме '#', и из-за '*' следующих '%', ** discard ** всех совпадающих символов. Любые отброшенные совпадения не увеличивают количество совпадений, возвращаемое 'sscanf'. Так что да, это будет фактически ** пропускать ** все символы до '#', но это не совсем то, что он делает. Еще хороший ответ. –

+0

Я сделал небольшое дополнение к концу ответа. Посмотрите и сообщите мне, есть ли у вас возражения. –

+0

@ Давид К. Ранкин. Разумеется, никаких возражений нет, так как ваши уточнения уместны. –

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