2009-07-13 9 views
0

Ich habe folgendes Problem Hausaufgaben:die strcmp (STR1, STR2) Funktion in C#

Es gibt viele Möglichkeiten man die strcmp implementieren können() Funktion.
Beachten Sie, dass strcmp (str1, str2) eine negative Zahl zurückgibt, wenn str1 alphabetisch über str2 liegt, 0, wenn beide gleich sind, und postiveve, wenn str2 alphabetisch über str1 liegt.

In kann in C implementiert werden, wie folgt:

int mystrcmp(const char *s1, const char *s2) 
{ 
    while (*s1==*s2) 
    { 
     if(*s1=='\0') 
      return(0); 
     s1++; 
     s2++; 
    } 
    return(*s1-*s2); 
} 

So, jetzt will ich es in C# implementieren, ohne in Methoden der .NET eine der eingebauten zu verwenden. Wie kann ich das erreichen?

+4

von alphabetisch, betrachten Sie Kultur Unterschiede? Warum willst du das umsetzen? Im Member CultureInfo.CompareInfo, CultureInfo.CurrentUICulture.CompareInfo.Compare (s1, s2); –

+0

Ich möchte lernen, wie ich einige c-Typ-Operationen mit C# durchführen kann. alphabetisch bedeutet "AB" ist größer als "AC" ...Also, wenn diese 2 Strings verwendet werden, sollte Ergebnis negativ sein – Learner

Antwort

0

Schreiben Sie es wie in C, aber verwenden Sie Array-Indexnotation anstelle von Zeigernotation.

Inkrementieren Sie den Index.

+0

Ich habe das ... aber ich bin verwirrt, wie man alphabetisch überprüft – Learner

5

Um die Verwendung der in .NET oder BCL verfügbaren Methoden zu vermeiden, müssten Sie die Length-Eigenschaft von string vermeiden (da Eigenschaften durch eine oder zwei Methoden implementiert werden). Und aus dem gleichen Grund müssten Sie auch die [] Indexer-Eigenschaft vermeiden.

So bist du schön ausgestopft.

Sie nehmen an, dass der numerische Zeichencode eine menschenhohe Sortierreihenfolge angibt. Es ist nicht - die Zeichencodes in C# sind Unicode, die viele Alphabete enthält, von denen einige eine Mischung aus dem westlichen Alphabet (niedrige Werte) mit ihren eigenen zusätzlichen Zeichen (hohe Werte) verwenden.

Sie können also eine große Menge an Zeichensatzinformationen in Ihrem eigenen Code reproduzieren, damit Sie wissen, wie Sie zwei Zeichen aus Unicode bestellen oder eine Methode in der BCL aufrufen müssen.

2

ein Weg könnte so sein. Code bearbeitet auf Kommentare basiert ...

public static int mystrcmp(string st1, string st2) 
{ 
    int iST1 = 0, iST2=0; 
    for (int i = 0; i < (st1.Length > st2.Length ? st1.Length : st2.Length); i++) 
    { 
     iST1 += (i >= st1.Length ? 0 : st1[i]) - (i >= st2.Length ? 0 : st2[i]); 
     if (iST2 < 0) 
     { 
      if (iST1 < 0) 
       iST2 += iST1; 
      if (iST1 > 0) 
       iST2 += -iST1; 
     } 
     else 
     { 
      iST2 += iST1; 
     } 
    } 
    return iST2; 
} 
+0

wie funktioniert diese Aussage 'st1 [i] - st2 [i];' ... .? – Learner

+0

@Learner - Sie könnten es genau so in C schreiben, es bedeutet dasselbe. Die einzige Sache im Körper dieser Funktion, die nicht gültig ist C ist st1.length, die strlen (st1) sein könnte, vorausgesetzt die Strings werden zu "const char *". –

+0

habe es ... das heißt st1 [i] - st2 [i]; wird ein ASCII-Zeichen Wert Subtraktion gehen .... so wird es negativen Wert für 'A' - 'B' geben ..... – Learner

2

Holen Sie sich eine Kopie von .NET Reflector und untersuchen, wie die Vergleichs()/CompareTo() Methoden der System.String und System.Globalization.CompareInfo in mscorlib umgesetzt werden.

1

Verwenden Sie nicht char*, wenn Sie dies tun möchten. Char* ist Unicode, Sie brauchen ASCII.

Ihre beste Wette wäre byte*. Dann können Sie den Algorithmus verwenden, den Sie derzeit haben.

1

Berechnen Sie die Levenshtein distance zwischen den beiden Strings. und zurück, dass ...

Hier ist eine .NET-Implementierung des Levenshtein Abstandes von dot net Pearls:

using System; 

/// <summary> 
/// Contains approximate string matching 
/// </summary> 
static class LevenshteinDistance 
{ 
    /// <summary> 
    /// Compute the distance between two strings. 
    /// </summary> 
    /// <param name=s>The first of the two strings.</param> 
    /// <param name=t>The second of the two strings.</param> 
    /// <returns>The Levenshtein cost.</returns> 
    public static int Compute(string s, string t) 
    { 
     int n = s.Length; 
     int m = t.Length; 
     int[,] d = new int[n + 1, m + 1]; 

     // Step 1 
     if (n == 0) 
     { 
      return m; 
     } 

     if (m == 0) 
     { 
      return n; 
     } 

     // Step 2 
     for (int i = 0; i <= n; d[i, 0] = i++) 
     { 
     } 

     for (int j = 0; j <= m; d[0, j] = j++) 
     { 
     } 

     // Step 3 
     for (int i = 1; i <= n; i++) 
     { 
      //Step 4 
      for (int j = 1; j <= m; j++) 
      { 
       // Step 5 
       int cost = (t[j - 1] == s[i - 1]) ? 0 : 1; 

       // Step 6 
       d[i, j] = Math.Min(
        Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), 
        d[i - 1, j - 1] + cost); 
      } 
     } 
     // Step 7 
     return d[n, m]; 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     Console.WriteLine(LevenshteinDistance.Compute("aunt", "ant")); 
     Console.WriteLine(LevenshteinDistance.Compute("Sam", "Samantha")); 
     Console.WriteLine(LevenshteinDistance.Compute("flomax", "volmax")); 
    } 
} 
Verwandte Themen