2016-01-27 6 views
0

Мой опыт программирования чрезвычайно разбросан, и я не могу найти ответ на то, что я надеюсь, это простой вопрос. На прошлой неделе у меня было задание, что я не закончил правильно, и это подвело меня до смерти.Алфавитное сравнение двух строк в C

Я должен был сравнить две строки в алфавитном порядке, не используя strcmp, и выяснить, какая строка сначала в алфавитном порядке с помощью указателей.

int strcmp373(char *str1, char *str2) { 
    while(*str1 != '\0') 
    { 
    str1++; 
    } 
    while(*str2 != '\0') 
    { 
    str2++; 
    } 
if(*str1 == *str2) 

} 

Это моя ужасная попытка, мой мыслительный процесс заключается в том, чтобы использовать значение с нулевым завершением. Я надеялся, что смогу понять и объяснить, как это работает?

Настоящая копия спецификации присваивания для справки.

Напишите функцию strcmp373, которая сравнивает две строки точно так же, как strcmp делает в библиотеке C. На этот раз, пожалуйста, используйте «синтаксис указателя» при написании этой функции. То есть, оператор [] не должен использоваться вообще при обращении к конкретным символам в строках1 и строке2; вместо этого все параметры и локальные переменные должны быть объявлены как указатели (с использованием символа *). Убедитесь, что вы эмулируете функцию strcmp C. Обратите внимание, что strcmp возвращает 0, если две строки равны, хотя значение 0 обычно означает false в C. Знак других значений возвращаемых значений используется для указания того, каким образом строки не совпадают, но точное возвращаемое значение не имеет значения , Для завершения этого кода вы не можете использовать какие-либо встроенные функции библиотеки строк C.

Вот прототип этой функции:

int strcmp373(char *, char *); 

А вот главная функция, которую вы можете использовать для тестирования strcmp373.

#include <stdio.h> 
#include "hw3.h" // to be discussed 

int main() { 
char str1[81], str2[81]; 
char again = 'y', newline; 
while (again == 'y') { 
    printf("Enter a string\n"); 
    scanf("%s", str1); 
    printf("Enter another string\n"); 
    scanf("%s", str2); 
    int comp = strcmp373(str1, str2); 
    if (comp < 0) 
     printf("%s is alphabetically before %s\n", str1, str2); 
    else if (comp > 0) 
     printf("%s is alphabetically after %s\n", str1, str2); 
    else printf("%s and %s are the same\n", str1, str2); 
    printf("Again? (y/n)\n"); 
    scanf("%c%c", &newline, &again); 
} 
} 
+3

Это всегда будет сравнивать только конечные нули ... – usr2564301

+1

Возможные дубликат [Как отсортировать массив строки в алфавитном порядке (чувствительно к регистру, нестандартную сверку)] (http://stackoverflow.com/questions/12646734/how-to-sort-an-array-of-string-alphabetical-case-sensitive-nonstandard-colla) –

+0

@ Lashane: этот предлагаемый дубликат специально запрашивает * нестандартный * сопоставление - это вот «обычное» сравнение. – usr2564301

ответ

0
if(*str1 == *str2) 

У вас есть, если заявление без тела в вашем фрагменте кода.

Кроме того, ваша программа подсчитывает количество символов в массиве символов, переданных этой функции. Это не достигнет цели.

Позволяет каждому элементу массива слово. То, что вы хотите сделать, это найти, какое слово «слово» на первом месте в алфавите. Я предлагаю посмотреть таблицу ASCII.

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

Если они не капитализированы. Для этого потребуется немного больше работы. Вот таблица ASCII, где вы можете увидеть разницу. enter image description here

This will get you started with figuring out how to get the ASCII value of these letters

+0

Большое спасибо за подробный ответ. Я знаю, что мой код был полностью сломан. Я просто расстроился и подумал, что пришло время создать учетную запись здесь, чтобы выяснить, что я делаю, поэтому я только что опубликовал то, что у меня было. Итак, реальная проблема заключается в том, как преобразовать строку в ASCII, и в этот момент я могу вернуть это значение обратно к основной функции и сравнить ее таким образом, правильно? – Ben

+1

Таблица ASCII не требуется. Элементы строки - это коды символов, которые вам нужно сравнить. – Barmar

6

Скажем str1 указывает на то, что держит «абвг» и str2 указывает на то, что держит «ABC».

str1 
| 
v 
+---+---+---+---+----+ 
| a | b | c | d | \0 | 
+---+---+---+---+----+ 

str2 
| 
v 
+---+---+---+----+ 
| a | b | c | \0 | 
+---+---+---+----+ 

При выполнении

while(*str1 != '\0') 
{ 
    str1++; 
} 

Вы двигаетесь str1, пока он не указывает на нулевой символ.

str1 
| 
v 
+---+---+---+---+----+ 
| a | b | c | d | \0 | 
+---+---+---+---+----+ 

    str1 
    | 
    v 
+---+---+---+---+----+ 
| a | b | c | d | \0 | 
+---+---+---+---+----+ 

     str1 
     | 
     v 
+---+---+---+---+----+ 
| a | b | c | d | \0 | 
+---+---+---+---+----+ 

      str1 
      | 
      v 
+---+---+---+---+----+ 
| a | b | c | d | \0 | 
+---+---+---+---+----+ 

       str1 
       | 
       v 
+---+---+---+---+----+ 
| a | b | c | d | \0 | 
+---+---+---+---+----+ 

Аналогично, при выполнении

while(*str2 != '\0') 
{ 
    str2++; 
} 

Вы двигаетесь str2, пока он не указывает на нулевой символ.

str2 
| 
v 
+---+---+---+----+ 
| a | b | c | \0 | 
+---+---+---+----+ 

    str2 
    | 
    v 
+---+---+---+----+ 
| a | b | c | \0 | 
+---+---+---+----+ 

     str2 
     | 
     v 
+---+---+---+----+ 
| a | b | c | \0 | 
+---+---+---+----+ 

      str2 
      | 
      v 
+---+---+---+----+ 
| a | b | c | \0 | 
+---+---+---+----+ 

Когда while петли сделаны, как str1 и str2 указывают на нулевой символ. Следовательно, *str1 == *str2 всегда оценивает true.

Вам нужно сравнить *str1 и *str2, а затем увеличить их вместе, если они равны, пока они не будут равны или вы достигнете конца строк.

str1 
| 
v 
+---+---+---+---+----+ 
| a | b | c | d | \0 | 
+---+---+---+---+----+ 

str2 
| 
v 
+---+---+---+----+ 
| a | b | c | \0 | 
+---+---+---+----+ 

    str1 
    | 
    v 
+---+---+---+---+----+ 
| a | b | c | d | \0 | 
+---+---+---+---+----+ 

    str2 
    | 
    v 
+---+---+---+----+ 
| a | b | c | \0 | 
+---+---+---+----+ 

     str1 
     | 
     v 
+---+---+---+---+----+ 
| a | b | c | d | \0 | 
+---+---+---+---+----+ 

     str2 
     | 
     v 
+---+---+---+----+ 
| a | b | c | \0 | 
+---+---+---+----+ 

      str1 
      | 
      v 
+---+---+---+---+----+ 
| a | b | c | d | \0 | 
+---+---+---+---+----+ 

      str2 
      | 
      v 
+---+---+---+----+ 
| a | b | c | \0 | 
+---+---+---+----+ 

Теперь, когда вы знаете, что они не равны и 'd' больше тха '\0' возвращает положительное значение, указывающее LHS в алфавитном порядке больше, чем ОРЗ.

Эта логика может быть реализована с использованием:

while (*str1 != '\0' && *str1 == *str2) 
{ 
    ++str1; 
    ++str2; 
} 

return (*str1 - *str2); 
+0

@R Sahu Ничего себе, спасибо! Я не знаю, почему я так долго укладывал себя в стек, LOL. Я попробовал, и это сработало, но я что-то упустил. Кстати, я читаю, что не будет ли длиннее слово всегда быть в алфавитном порядке? – Ben

+0

@Ben, No. Цикл будет прерываться, если '* str1' не равен' * str2'.Если 'str1' указывает на« xyz »и« str2 »указывает на« abcdef », функция вернется с положительным значением. –

+0

@R Sahu Так что в этом случае он сломался бы на первого символа, правильно? В этом случае вычитая str2 из str1, результат будет положительным, потому что a> x ... right? – Ben