2012-06-13 2 views
-3

Я получил строку, что внутри у него есть:номера коммутация внутри строки

[email protected]@[email protected]@[email protected] и продолжать идти ...

мне нужно переключить каждое число то будет 2 или больше, до 1, так что я писал:

for (i = 0 ; i < strlen(data) ; i++) 
{ 
    if (data[i] >= 50 && data[i] <= 57) // If it's a number 
    { 
     data[i] = '1'; // switch it to one 
     while (data[i] >= 48 && data[i] <= 57) 
     { 
      i++; 
     } 
    } 
} 

проблема заключается в том, что она делает номера как 0,051511 1,111111, как тоже ... Потому что не смотрит на двойной, как один числа, но каждое число seperatly ... Как я могу сделать Это ? Thanks

+1

Существует путаница в определении понятия «номер». Можете ли вы показать, какой результат ДОЛЖЕН быть? Должно ли 2.5005 быть изменено на 1.1001 или 1.0000 или 1? – hatchet

ответ

3

Для выяснения вопроса, так как неясно, вы хотите иметь следующий вход:

"[email protected]@[email protected]@[email protected]" 

быть изменен, чтобы быть следующим:

"[email protected]@[email protected]@[email protected]" 

Ваша проблема заключается в том, что вам нужно проанализируйте каждое число в значение float, чтобы выполнить какое-либо сравнение. Либо это, либо вам нужно будет вручную разобрать его, проверив «.». персонаж. Выполнение этого вручную жестко, подвержено ошибкам и ненужно, потому что стандартная библиотека C предоставляет функции, которые могут вам помочь.

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

Ваш первый шаг к tokenise вход в следующее:

"2" 
"0.88315" 
"1" 
"1.5005" 
"true" 
"0.112" 

Это может быть сделано путем перебора строки и либо разделив его или с помощью указателя, после которого «@» происходит характер. Разделение строки можно сделать с помощью strtok. Однако strtok разделит строку, изменив ее, что не обязательно необходимо в нашем случае. Более простой метод - просто перебирать строку и останавливаться каждый раз после достижения символа «@». Вход будет затем tokenised к следующему:

"[email protected]@[email protected]@[email protected]" 
"[email protected]@[email protected]@0.112" 
"[email protected]@[email protected]" 
"[email protected]@0.112" 
"[email protected]" 
"0.112" 

Некоторые из этих подстрок не начинаются со строки, которая представляет собой поплавок. Вам нужно будет определить, кто из них. Для этого вы можете попытаться проанализировать фронт каждой строки как float. Это можно сделать с помощью sscanf. После разбора поплавков вы сможете выполнить сравнение, которое хотите.

Вы пытаетесь изменить строку на другую длину, поэтому при замене значения float на «1» вам нужно проверить длину исходного значения. Если он длиннее 1 символа, вам придется переместить последующие символы вперед.Например:

"[email protected]" 

Если вы разобрали первый маркер и нашел, что это будет > 2, вы бы заменить первый символ с «1». Этот результат:

"[email protected]" 

Вы тогда еще нужно удалить остальную часть этого маркера, сдвигая остальные строки вниз, чтобы получить:

"[email protected]" 
+0

Вы не видели, что я написал в главном сообщении ... У меня есть цифры, как 0.28151, и это делает em 1.1111 ... – AmitM9S6

+0

@ AmitM9S6: Я добавил пример. Код, который я опубликовал, работает. Если вы использовали его, и он делает что-то другое, вы использовали его неправильно. В этом случае вы должны отредактировать исходный вопрос с помощью кода, который вы используете. Из вашего вопроса неясно, в чем именно заключается ваше требование. Если я ошибаюсь, вам нужно указать пример ввода и вывод, который вы ожидаете от него. –

+0

Это не то, что я хочу сделать ... Я смог сделать то, что сделал тоже ... – AmitM9S6

0

Похоже, вы сравниваете char и int в ваших операциях if.

Вы должны выяснить, почему это имеет значение и компенсирует это.

+0

Я знаю, что это должно быть, хотя сравнение отлично работает ... проблема в алгоритме, а не в программировании ... – AmitM9S6

+0

Похоже, вы изменили код, чтобы пропустить символы, которые были больше 48 и меньше 57. Это кажется противоположным тому, что вы хотите сделать. Я бы изменил условие while while на 'data [i] <'0' || data [i]> '9'' – gcochard

+0

Я изменил его, но теперь моя проблема заключается в том, что он делает не только числа с номерами выше 2 к 1, но и делает число с плавающей запятой в 1 (например, 0,15165158 в 1.111111111), которое я не хочу .. – AmitM9S6

0

Вы сравнения символов в строке одной вовремя. Если вам нужно учитывать все символы «@» как одно число, это не сработает. Попытайтесь получить эти числа в массив, отбросьте их до двойника, а затем сравните их с 2.

+0

Проблема в том, что если я положу em в массив, он рассмотрит 0.25 как 0, 2, 5 ... – AmitM9S6

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