Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Свой strcmp велосипед на Си для PHP
Форумы портала PHP.SU » » Программирование на C++ » Свой strcmp велосипед на Си для PHP

Страниц (1): [1]
 

1. dcc0 - 30 Мая, 2018 - 20:41:46 - перейти к сообщению
Решил освежить С. Написал такой почти бесполезный велосипед для проверки двух строк, содержащих числа (только) числа.
Два файла, первый функция PHP:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. /*Данная программа сравнивает две строки, содержащие числа (только).
  4. Возвращает A > B, B < A или A = B, code 1, 2 и 3.
  5. This program compares two strings, which contains numbers (only).
  6. It returns: A > B, B < A or A = B, code 1, 2 and 3.
  7. Если в начале одной из переменных есть нули, то
  8. переменные а и b должны быть в одинарных или двойных кавычках -
  9. Для А=044 и B=44 без кавычек приведет к неверному выводу. Для А='044' и B='44' -
  10. результат должен быть корректным.
  11. */
  12.  
  13.         function numbers_diff($a, $b)  {
  14.         return print_r((`exec ./numbers_diff.o $a $b`));
  15. }
  16. numbers_diff((int)$a, (int)$b);
  17.  
  18. ?>
  19.  

В функции на всякий случай приведение к int переменных.
Функция также корректно обрабатывает знак минус, т.е. можно задать так:
a='-10';
b='2';

Часть на С

CODE (c):
скопировать код в буфер обмена
  1.  
  2. /*
  3. Данная программа сравнивает две строки, содержащие числа (только).
  4. Возвращает A > B, B < A или A = B, code 1, 2 и 3.
  5. Внимание! при сравнениии A = 123, B=0023 - результат будет неверным.
  6. This program compares two strings, which contains numbers (only).
  7. It returns: A > B, B < A or A = B, code 1, 2 and 3.
  8. Attention! A = 123, B=0023 gives incorrect result.
  9.  
  10. */
  11.  
  12. #include <stdio.h>
  13.   /*Функция печати результата*/
  14.   int ret(int r) {
  15.     printf("%d", r);
  16.     return r;
  17.   }
  18.  
  19. int main(int argc, char * argv[]) {
  20.  
  21.   int r = 0;
  22.   /*Переменная с кодом результата
  23.    Проверим ввод аргументов*/
  24.   if (argc != 3) {
  25.     printf("Restart it with two arguments!\n");
  26.     return ret(0);
  27.   }
  28.  
  29.   int i = 0;
  30.   int j = 0;
  31.   /*Проверим знаки*/
  32.   if (argv[1][0] == '-' && argv[2][0] != '-') return ret(2);
  33.   if (argv[2][0] == '-' && argv[1][0] != '-') return ret(1);
  34.  
  35.   //Считаем число символов в аргументах
  36.   while (argv[1][i] != '\0') i++;
  37.   while (argv[2][j] != '\0') j++;
  38.   /*Печатаем, то, кoторое больше, если числа отриц.*/
  39.   if (argv[2][0] == '-' && argv[1][0] == '-') {
  40.     if (j > i) return ret(1);
  41.     if (j < i) return ret(2);
  42.   }
  43.   /*Печатаем, то, кoторое больше, если числа полож.*/
  44.   else {
  45.     if (j > i) return ret(2);
  46.     if (j < i) return ret(1);
  47.   }
  48.   /*Ищем первый больший знак от начала аргументов*/
  49.   i = 0;
  50.   /*Если числа положительные (без знака -минус)*/
  51.   if (argv[2][0] != '-' && argv[1][0] != '-') {
  52.     while (i != j) {
  53.       /*Если A < B и неотрицательные
  54.        Если A > B и неотрицательные*/
  55.       if (argv[1][i] < argv[2][i]) return ret(2);
  56.       if (argv[1][i] > argv[2][i]) return ret(1);
  57.       i++;
  58.     }
  59.   }
  60.   /*Инвертируем*/
  61.   else {
  62.     i = 0;
  63.     while (i != j) {
  64.       if (argv[1][i] < argv[2][i]) return ret(1);
  65.       if (argv[1][i] > argv[2][i]) return ret(2);
  66.       i++;
  67.     }
  68.   }
  69.   /*Аргументы равны*/
  70.   ret(3);
  71.   return r;
  72. }
  73.  
  74.  

 

Powered by ExBB FM 1.0 RC1