Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 20

Написать программу, содержащую две функции, сравнения строк, эквивалентные стандартной функции strcmp

15.12.2015, 19:03. Показов 2057. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер, многоуважаемые гуру программирования. Прошу помочь написать одну программу, собственно, вот она: "Написать программу, содержащую две пользовательские функции сравнения строк, эквивалентные стандартной функции strcmp. Первая из них должна использовать индексацию массива, вторая – указатели и арифметические операции с ними." На форуме уже есть похожая тема(Написать функции сравнения строк, эквивалентные стандартной функции strcmp), в ней скинули ссылку на другую тема, в которой есть решение данной задачи, но я, к сожалению, не с мог в ней разобраться. Если кто то может объяснить или знает, как написать эту программу, пожалуйста помогите, буду очень признателен, заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2015, 19:03
Ответы с готовыми решениями:

Написать функции сравнения строк, эквивалентные стандартной функции strcmp
Здравствуйте! Помогите, пожалуйста, с задачкой) Написать программу, содержащую две пользовательские функции сравнения строк,...

Написать две пользовательские функции объединения строк
Помогите написать программу, содержащую две пользовательские функции объединения строк, эквивалентные стандартной функции strcat,...

Ошибка сравнения строк strcmp()
Проблема состоит в том, что в цикле while не происходит корректное сравнение строк. По задумке, если пользователь вводит точку...

4
 Аватар для Геомеханик
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
16.12.2015, 20:30
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Если по примитивному, тогда вот накидал.
C Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <string.h>
 
//ptr
int p_strcmp(const char* s1, const char* s2){
    int ret;
    while(!(ret = (int)*s1 - *s2) && *s1){
        ++s1;
        ++s2;
    }
    return ret;
}
 
//index
int i_strcmp(const char* s1, const char* s2){
    int ret, i = 0, j = 0;
    while(!(ret = (int)*(s1 + i) - *(s2 + j)) && *(s1 + i)){
        ++i;
        ++j;
    }
    return ret;
}
 
int main(void){
    printf("% 2d\t% 2d\n", strcmp("ABC", "ABC"), p_strcmp("ABC", "ABC"));
    printf("% 2d\t% 2d\n", strcmp("A",  "ABC"),  p_strcmp("A", "ABC"));
    printf("% 2d\t% 2d\n", strcmp("ABC", "AB"),  p_strcmp("ABC", "AB"));
    putchar('\n');
    printf("% 2d\t% 2d\n", strcmp("xyz", "XYZ"),  i_strcmp("xyz", "XYZ"));
    printf("% 2d\t% 2d\n", strcmp("PHP", "PHPi"), i_strcmp("PHP", "PHPi"));
    printf("% 2d\t% 2d\n", strcmp("12",  "19"),   i_strcmp("12", "19"));
    return 0;
}
Пример работы кода
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12841 / 7582 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
17.12.2015, 02:52
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Вместо бонуса
C Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int mystrcmp(const char * a, const char * b) {
    return ( *a && *a == *b ) ? mystrcmp(a + 1, b + 1) : *a - *b;
}
 
int main(void) {
    char sA[BUFSIZ], sB[BUFSIZ];
    
    while ( printf("First: ") && fgets(sA, BUFSIZ, stdin) && *sA != '\n' && printf("Second: ") && fgets(sB, BUFSIZ, stdin) ) {
        int d = mystrcmp(sA, sB);
        printf("%s\n", ( d < 0 ) ? "First less" : ( d > 0 ) ? "Second less" : "The same");
    }
    
    return 0;
}
0
0 / 0 / 1
Регистрация: 12.12.2015
Сообщений: 20
23.12.2015, 08:36  [ТС]
Спасибо большое за ответы!
Вот, тоже что-то написал) Оставлю тут, может кому пригодится.
C Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <stdio.h> 
#include <stdlib.h> 
 
int ind(char *x, char *y)
{
    int i, result;
    for (i = 0, result = 0; ; i++)
    {
        if ((x[i] == 0) && (y[i] == 0)) { break; }
        if (x[i] == 0) { result = 1; break; }
        if (y[i] == 0) { result = 2; break; }
        if (x[i]<y[i]) { result = 1; break; }
        else if (x[i]>y[i]) { result = 2; break; }
    }
    return result;
}
 
int ukaz(char *x, char *y)
{
    int i, result;
    for (i = 0, result = 0; ; i++)
    {
        if ((*(x + i) == 0) && (*(y + i) == 0)) { break; }
        if (*(x + i) == 0) { result = 1; break; }
        if (*(y + i) == 0) { result = 2; break; }
        if (*(x + i)<*(y + i)) { result = 1; break; }
        else if (*(x + i)>*(y + i)) { result = 2; break; }
    }
    return result;
}
 
int main() {
    char a[100], b[100];
    int status;
    printf("A="); scanf("%s", a);
    printf("B="); scanf("%s", b);
    status = ind(a, b);
    switch (status)
    {
    case 0: printf("With ind:\nA=B"); break;
    case 1: printf("With ind:\nA<B"); break;
    case 2: printf("With ind:\nA>B"); break;
    }
    printf("\n");
    status = ukaz(a, b);
    switch (status)
    {
    case 0: printf("With ukaz:\nA=B\n"); break;
    case 1: printf("With ukaz:\nA<B\n"); break;
    case 2: printf("With ukaz:\nA>B\n"); break;
    }
}
0
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
23.12.2015, 11:16
Для потомков:
C Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <stdio.h>
#include <string.h>
 
int StrcmpPointers(const char* p1, const char* p2)
{
  const unsigned char* s1 = (const unsigned char*) p1;
  const unsigned char* s2 = (const unsigned char*) p2;
 
  unsigned char c1 = 0;
  unsigned char c2 = 0;
 
  do
  {
    c1 = (unsigned char) *s1;
    c2 = (unsigned char) *s2;
    
    s1++;
    s2++;
 
    if (c1 == '\0')
    {
      return c1 - c2;
    }
  }
  while (c1 == c2);
 
  return c1 - c2;
}
 
int StrcmpIndex(const char* p1, const char* p2)
{
  const unsigned char* s1 = (const unsigned char*) p1;
  const unsigned char* s2 = (const unsigned char*) p2;
 
  unsigned char c1 = 0;
  unsigned char c2 = 0;
 
  size_t index = 0;
 
  do
  {
    c1 = (unsigned char) s1[index];
    c2 = (unsigned char) s2[index];
    index++;
 
    if (c1 == '\0')
    {
      return c1 - c2;
    }
  }
  while (c1 == c2);
 
  return c1 - c2;
}
 
char* VerifyResult(const int one, const int two, const int three)
{
  static char testResult[7];
 
  strcpy(testResult, "FAILED");
 
  if (((one > 0) && (two > 0) && (three > 0)) ||
      ((one < 0) && (two < 0) && (three < 0)) ||
      ((one == two) && (two == three) && (three == 0)))
  {
    strcpy(testResult, "PASSED");
  }
 
  return &testResult[0];
}
 
void RunTest(void)
{
  char* strings1[] = {
    "v5E2gQj1uU",
    "Ple19jNhRc", /* !!! */
    "NH3pz6mK2Y",
    "uhv5D3k3bl",
    "fXxEXAABbr",
    "eA4iMAWY0b", /* !!! */
    "24QmKOCS3Y",
    "ztiEQoic1o",
    "WjbZP81kKT",
    "F2B3Eww6lc"};
  char* strings2[] = {
    "oDXd4kpg2R",
    "Ple19jNhRc", /* !!! */
    "wJMZNuvNS3",
    "pHDyPJv8KD",
    "H1yvUdmfTt",
    "eA4iMAWY0b", /* !!! */
    "A5An4wQ8gU",
    "WGgW6NkIgD",
    "Wb5989AAzE",
    "jeAtaoS7is"};
 
  size_t i = 0;
  size_t N = sizeof(strings1) / sizeof(*strings1);
 
  int pointerRes = 0;
  int indexRes = 0;
  int stdRes = 0;
 
  for (i = 0; i < N; i++)
  {
    pointerRes = StrcmpPointers(strings1[i], strings2[i]);
    indexRes = StrcmpIndex(strings1[i], strings2[i]);
    stdRes = strcmp(strings1[i], strings2[i]);
 
    printf("s1 = '%s', s2 = '%s', res (ptr/idx/std): %d / %d / %d -> %s\n",
      strings1[i],
      strings2[i],
      pointerRes,
      indexRes,
      stdRes,
      VerifyResult(pointerRes, indexRes, stdRes));
  }
}
 
int main(void)
{
  RunTest();
  return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.12.2015, 11:16
Помогаю со студенческими работами здесь

Написать две пользовательские функции, эквивалентные стандартной функции strlen
Написать программу, содержащую две пользовательские функции определения длины строки, эквивалентные стандартной функции strlen. Первая из...

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

Написать программу содержащую две функции
Написать программу, содержащую две функции. Первая функция, выводящая на экран строку одинаковых символов, располагается до функции main()....

Написать программу, содержащую две функции
Первая функция, вычисляющая объем цилиндра по известному радиусу основания и высоте, располагается до функции main(). Вторая, функция...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
TypeScript: Интерфейсы vs Типы
run.dev 11.04.2025
Современная разработка на JavaScript сталкивается с множеством проблем при масштабировании проектов. Типизация кода стала хорошим инструментом, помогающим избежать ошибок во время выполнения,. . .
Управление топиками и разделами Kafka
Javaican 11.04.2025
Apache Kafka — распределенная платформа потоковой передачи данных, которая стала стандартом для построения высоконагруженных систем обмена сообщениями. В современной архитектуре микросервисов,. . .
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
Агрегаты и сущности в DDD микросервисах
Javaican 10.04.2025
Разработка современных программных систем часто приводит на распутье: монолит или микросервисы? Даже при выборе микросервисной архитектуры многие команды сталкиваются с проблемой правильного. . .
Многопоточность в C#: Task и параллельное программирование
UnmanagedCoder 10.04.2025
Современные процессоры уже давно перестали наращивать тактовую частоту в пользу увеличения количества ядер. Это создало интересную ситуацию: разработчики, привыкшие к последовательному. . .
Линейное решение нелинейной задачи с помощью арктангенса для метода обработки данных из double buffering.
Hrethgir 10.04.2025
Публикация в доработке, метод арктангенса в комментариях внизу. Вообще изначально я пренебрёг квадратурой числа, но потом понял, что для вычисления приблизительного значения - сгодится, формулу. . .
Переменные в Python
py-thonny 10.04.2025
Переменная в программировании — это символическое имя, связанное с областью памяти, в которой хранится значение. Она позволяет получать доступ к данным через понятные человеку идентификаторы, а не. . .
Многопоточность в C#: Task и асинхронные операции
UnmanagedCoder 10.04.2025
Многопоточность позволяет выполнять несколько операций одновременно, что важно для решения двух основных задач: повышения скорости выполнения вычислительно-сложных операций и сохранения отзывчивости. . .
Запуск контейнеров Docker на ARM64
Mr. Docker 09.04.2025
Появление таких решений, как Apple M1/ M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер