Как извлечь числа из строки в c?

Скажем, у меня есть строка типа ab234cid*(s349*(20kd и я хочу извлечь все числа 234, 349, 20 , что мне делать?

Вы можете сделать это с помощью strtol , например:

 char *str = "ab234cid*(s349*(20kd", *p = str; while (*p) { // While there are more characters to process... if ( isdigit(*p) || ( (*p=='-'||*p=='+') && isdigit(*(p+1)) ) { // Found a number long val = strtol(p, &p, 10); // Read number printf("%ld\n", val); // and print it. } else { // Otherwise, move on to the next character. p++; } } 

Ссылка на идеон .

Возможное решение с использованием sscanf() и наборов сканирования:

 const char* s = "ab234cid*(s349*(20kd"; int i1, i2, i3; if (3 == sscanf(s, "%*[^0123456789]%d%*[^0123456789]%d%*[^0123456789]%d", &i1, &i2, &i3)) { printf("%d %d %d\n", i1, i2, i3); } 

где %*[^0123456789] означает игнорирование ввода до тех пор, пока не будет найдена цифра. См. Демонстрацию по адресу http://ideone.com/2hB4UW .

Или, если количество чисел неизвестно, вы можете использовать спецификатор %n для записи последней позиции, прочитанной в буфере:

 const char* s = "ab234cid*(s349*(20kd"; int total_n = 0; int n; int i; while (1 == sscanf(s + total_n, "%*[^0123456789]%d%n", &i, &n)) { total_n += n; printf("%d\n", i); } 

здесь после простого решения с помощью sscanf :

 #include #include #include char str[256]="ab234cid*(s349*(20kd"; char tmp[256]; int main() { int x; tmp[0]='\0'; while (sscanf(str,"%[^0123456789]%s",tmp,str)>1||sscanf(str,"%d%s",&x,str)) { if (tmp[0]=='\0') { printf("%d\r\n",x); } tmp[0]='\0'; } } 

Если числа помечены пробелом в строке, вы можете использовать sscanf (). Так как это не так с вашим примером, вы должны сделать это сами:

 char tmp[256]; for(i=0;str[i];i++) { j=0; while(str[i]>='0' && str[i]<='9') { tmp[j]=str[i]; i++; j++; } tmp[j]=0; printf("%ld", strtol(tmp, &tmp, 10)); // Or store in an integer array 

}

Создайте конечный автомат, который работает по одному основному принципу: текущий символ – число.

  • При переходе от нецифровой к цифре вы инициализируете свой номер current_number: =.
  • при переходе от цифры к цифре вы «сдвигаете» новую цифру в:
    current_number: = current_number * 10 + number;
  • при переходе от цифры к несимвольной, вы выводите current_number
  • когда от цифр не до цифр, вы ничего не делаете.

Возможны оптимизации.

Или вы можете сделать простую функцию следующим образом:

 // Provided 'c' is only a numeric character int parseInt (char c) { return c - '0'; } 
  • Как получить согласованное байтовое представление строк в C # без ручного указания кодировки?
  • Почему strncpy небезопасен?
  • Как я могу начать новую активность Android с помощью строки?
  • Преобразование массива строк в строку в Java
  • Объявления загружаются, но не отображаются?
  • Android-образец Bluetooth-кода для отправки простой строки через bluetooth
  • заменить специальные символы в строке в java
  • Хорошо ли использовать java.lang.String.intern ()?
  • LINQ: Строка строки Entity содержит любой массив строк
  • Удаление html-тегов из строки в R
  • Использовать строковые методы для поиска и подсчета гласных в строке?
  • Interesting Posts

    Unistalled C ++ Redistributables в Windows Vista

    Согласование структуры агрегации mongodb по вложенным документам

    Почему переполнение: скрытые имеют неожиданный побочный эффект роста в высоту, чтобы содержать плавающие элементы?

    Как определить, работает ли мой сценарий оболочки через трубу?

    Сканер пропускает nextLine () после использования next () или nextFoo ()?

    GA-P31-S3G загрузочный флеш-накопитель для материнских плат

    Точное определение «функционального интерфейса» в Java 8

    Windows 10 Компьютер просыпается во время ночи

    Как добавить строку в JTable?

    Разница между std :: regex_match и std :: regex_search?

    Gnome изменяет виртуальные рабочие столы, перемещая мышь до края экрана

    Как указать предпочтение пути библиотеки?

    Как заменить аудиопоток в видеофайле несколькими аудиопотоками?

    Почему Access сообщает, что не может получить команду для своей программы?

    Как исправить недостающие значки в панели задач и меню «Пуск»?

    Давайте будем гением компьютера.