2015-11-28 4 views
3

Я хочу извлечь только числа из строки и поместить их в массив.Как извлечь только цифры из строки?

Например, строка "fds34 21k34 k25j 6 10j340ii0i5".

Я хочу сделать один массив, какие элементы являются как следующие:

arr[0]=34, arr[1]=21, arr[2]=34, arr[3]=25, arr[4]=6, arr[5]=10, arr[6]=340, arr[7]=0, arr[8]=5; 

мой пробный код:

#include <stdio.h> 
int main() 
{ 
    char ch; 
    int i, j; 
    int pr[100]; 
    i=0; 
    while ((ch = getchar()) != '\n'){ 
     if(ch>='0' && ch<='9'){ 
      pr[i] = ch-'0'; 
      i++; 
    } 
    for(j=0; j<i; j++) 
     printf("pr[%d]: %d\n", j, pr[j]); 
    return 0; 
} 

Мой код не может распознать смежный номер. просто 'pr' массив имеет {3, 4, 2, 1, 3, 4, 2, 5, 6, 1, 0, 3, 4, 0, 0, 5}. Есть ли какой-либо метод для реализации моей цели?

+0

Вы можете показать нам свой код? – Cherubim

+0

На самом деле, у меня нет моего кода. Мне просто интересно, как найти только цифры в строке. Затем я попытался сделать некоторый код, а именно точные числа в строке. Но я этого не сделал. Но я отредактирую часть кода, подождите, пожалуйста, –

+0

Храните временный символ 'char *', сохраняйте числа как 'char', конвертируйте в 'int', а затем добавьте в' 'int []' при запуске в пробелы – Arc676

ответ

1

Используйте зсапЕ. Жизнь становится проще, когда вы используете стандартные функции вместо составления собственных алгоритмов.

Этот код использует сканирование, считывает строку ввода пользователя и затем анализирует его. Обнаруженные цифры помещаются в массив, и индекс поиска сдвигается вперед на количество цифр.

char line[100]; 
int p[100]; 
int readNums = 0; 
int readDigits = 0; 
int len; 
int index = 0; 

//get line 
scanf("%99[^\n]%n",line,&len); 

while(index < len){ 
    if(line[index] <= '9' && line[index] >= '0'){ 
     if(sscanf(line + index, "%d%n", p + readNums, &readDigits) != 1) 
      fprintf(stderr, "failed match!!!! D:\n"); 
     index += readDigits; 
     readNums++; 
    } 
    index++; 
} 

//print results 
printf("read %d ints\n", readNums); 

for(int i = 0; i < readNums; i++) 
    printf("p[%d] = %d\n", i, p[i]); 
+0

Обратите внимание, что 'scanf ("% 99 [^ \ n]% n ", строка, &len);' ничего не читает в 'строке' и оставляет' '' '' '' и 'len' uninitialized должен ввести' '\ n" '. – chux

+0

Ничего себе, я никогда не видел этот код. Спасибо. –

+0

man this is awesome @petEEy – Cherubim

2

Вот алгоритм:

  • Используйте строку для сохранения текущего номера. Сначала запустите его как пустую строку
  • , когда ch является цифрой ('0' .. '9'), поместите ее в эту строку
  • , когда ch не является цифрой, если строка не пуста, преобразуйте текущий строка к номеру atoi функция, и хранить это число в массиве. После этого инициализируйте текущую строку, чтобы снова очистить.

Ex: у меня есть строка "ab34 56d1"

  • использование строки ул хранить текущее число, в первую ул = "" (пусто)
  • ч = 'а', ничего не делать (потому что текущая строка пуста)
  • ч = «Ъ», ничего не делать
  • ч = «3», поместить его в строку, так что ул = «3»
  • ч = «4», поставить его на ул , теперь str = "34"
  • ч = '', преобразовать "34" до 34, сохранить его в массиве, инициализации ул = "" снова
  • .....
+0

Почему я не могу найти этот алгоритм? Когда я читаю некоторые способы сделать код, я считаю, что это не сложно. Но когда я пытался его создать, это так сложно ... Очень спасибо. попробуйте сделать код, используя этот алгоритм. –

+0

Я обновил свой ответ. Я думаю, что это легко понять и развить. Попробуйте запрограммировать его и спросить меня, если вы столкнулись с проблемой. – Viet

+0

Спасибо за ваш ответ –

1

Вот рабочий код. Я стараюсь в 3-4 раза работать нормально. chPrevious будет удерживать предыдущее состояние ch. Нет необходимости хранить цифры в строке цифры. Мы можем просто использовать целое число для этой цели.

#include<stdio.h> 
#define NONDIGIT 'a' 

int main() { 
    char ch, chPrevious; //chPrevious hold the previous state of ch. 
    chPrevious = NONDIGIT; 
    int temp = 0; 
    int pr[100]; 
    int i = 0; 
    while ((ch = getchar()) != '\n'){ 
    if((ch>='0' && ch<='9') && (chPrevious>='0' && chPrevious<= '9')){ 
     temp = temp * 10 + (ch - '0'); 
    } else if (ch>= '0' && ch<= '9' && temp != 0) { 
     pr[i++] = temp; 
     temp = 0; 
     temp = ch - '0'; 
    } else if (ch >= '0' && ch <= '9') { 
     temp = ch-'0'; 
    } 
    chPrevious = ch; 
    } 
    pr[i++] = temp; 
    for(int j=0; j<i; j++) 
     printf("pr[%d]: %d\n", j, pr[j]); 
    return 0; 
} 

Может быть, есть и другие способы сделать это и эффективно. Пожалуйста, игнорируйте плохой стиль. Вы также должны улучшить этот код.

+0

Есть заслуги в использовании 'isdigit()' from ''. –

+0

Спасибо за реальный код. –

+1

Вход «0 1 2 \ n» -> 'pr [0]: 1'' pr [1]: 2. Отсутствует первый номер – chux

1

Создать государственный автомат.

Отслеживать предыдущий символ - это была цифра?

При обнаружении цифры ...
... Если продолжив последовательность цифр, * 10 и добавить
...Else начать новую последовательность

Не перегружайте pr[]

Используйте int ch, чтобы правильно определить EOF

//char ch; 
int ch; 
bool previous_digit = false; 
int pr[100]; 
int i = 0 - 1; 
while (i < 100 && (ch = getchar()) != '\n' && ch != EOF) { 
    if (ch>='0' && ch<='9') { 
    if (previous_digit) { 
     pr[i] = pr[i] * 10 + ch - '0'; 
    } else { 
     i++; 
     pr[i] = ch - '0'; 
    } 
    previous_digit = true; 
    } else { 
    previous_digit = false; 
    } 
} 
i++; 
+0

спасибо. Код прост для понимания. :) –

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