Ich habe Probleme mit der Verwendung von strcmp() für ein const char * Array innerhalb einer Template-Spezialisierung.C++ ungültige Konvertierung von 'char' zu 'const char *' in strcmp() innerhalb einer Template-Spezialisierung
In meinem Skript möchte ich mehrere Arrays von großen Werten/Länge zu kleineren sortieren. Es funktioniert für ein Integer- und Float-Array, funktioniert jedoch nicht für ein const char * -Array. Ich habe 3 Template-Funktionen mit ihrer Definition deklariert. Für das Array const char * verwende ich eine spezialisierte Template-Funktion, die die Funktion strcmp (const char *, const char *) benutzt, um das Array zu sortieren.
Mein Skript ist wie folgt (zunächst die Vorlage Erklärungen, die zweite das Hauptskript, dritte die Template-Funktionsdefinitionen):
#include <iostream>
#include <string.h>
using namespace std ;
// Template function declarations
template <class T>
void order(T& a, T& b) ;
template <class T>
void sort(T* c, int d) ;
template <class T>
void display(T* e, int f) ;
// Main
int main() {
int random[10] = {10,23,5,37,56,0,20,88,95,32} ; // Random Array of integers
float random_fl[10] = {9.5,66.2,5.8,41.1,89.4,0.6,23.4,66.5,90.9,57.7} ; // Random Array of floats
const char* random_char[] = {"blah", "blahblah", "string", "character", "literal", "one", "randomize", "unsigned", "red", "wolf"} ;
int length = sizeof(random)/sizeof(int) ; // Calculating the lenght of the array
int length_fl = sizeof(random_fl)/sizeof(float) ;
int length_char = sizeof(random_char)/sizeof(const char*) ;
cout << "Initial integer Array: "; // Terminal message giving the initial array
for (int i = 0; i < length; ++i) {
cout << random[i] << " ";
}
cout << endl;
cout << "Initial float Array: ";
for (int i = 0; i < length_fl; ++i) {
cout << random_fl[i] << " ";
}
cout << endl;
cout << "Initial character Array: ";
for (int i = 0; i < length_char; ++i) {
cout << random_char[i] << " ";
}
cout << endl;
sort(random, length) ; // Call sort() function to sort array
sort(random_fl, length_fl) ;
sort(random_char, length_char) ;
display(random, length) ; // Call display() function to print sorted array in terminal
display(random_fl, length_fl) ;
//display(random_char, length_char) ;
return 0 ;
}
// Template function definitions
template <class T>
void order(T& a, T& b) { // order function using references
T Temp = a ;
a = b ;
b = Temp ;
}
template <class T>
void sort(T* c, int d) { // Sorting function
for (int i=0; i<d-1; i++) {
for (int j=0; j<d-1-i; j++) {
if(c[j+1] > c[j]) {
order(c[j] , c[j+1]) ;
}
}
}
}
template<>
void sort(const char* a, int b) { // Template specialization sort function for character string
for (int i=0; i<b-1; i++) {
for (int j=0; j<b-1-i; j++) {
if(strcmp(a[j+1], a[j])>0) {
order(a[j], a[j+1]) ;
}
}
}
}
template <class T>
void display(T* e, int f) { // Display function
cout << "Sorted Array: ";
for (int i=0; i<f; i++) {
cout << e[i] << " ";
}
cout << endl ;
}
Wenn das Skript kompilieren, erhalte ich die Fehlermeldung, dass eine ungültige Umwandlung auftritt von 'char' nach 'const char *' in der Funktion strcmp (const char *, const char *) innerhalb meiner spezialisierten Template-Funktion. Ich frage mich warum, da ich ein const char * -Array mit 10 String-Literalen definiert habe. Die Array-Elemente a [j + 1] und a [j] sollten also auch const char * -Elemente sein, da sie zu Beginn der spezialisierten Sortierfunktion mit der Definition von const char * a erwartet werden.
Ich bin ziemlich neu in C++ und habe vor allem Schwierigkeiten beim Verstehen von Zeigern und wie man sich auf Array-Elemente mit Zeigern/Referenzen bezieht, was meiner Meinung nach die Wurzel dieses Problems ist.
Bitte beachten Sie mein Englisch und danke im Voraus.
Edit:
Auch wenn meine if() Anweisung eine sortierte Zeichenfolge erhalten noch nicht korrekt ist, wie Steiner wies darauf hin, die strcmp() arbeitet nun wie vorgesehen.
Ich danke Ihnen allen freundlich für Ihre Hilfe.
Wenn 'a'' const char * 'ist,' a [j + 1] 'ist' char'. Was hast du erwartet? Oh, und es gibt eine Klammer, die um '0 'Vergleich fehlt. – Arkadiy
Nur noch ein Grund, C-Strings zu verwerfen und 'std :: string's zu verwenden. Dann könntest du auch 'std :: sort' verwenden. – NathanOliver
@Arkadiy, ja, tut mir leid. Ich sehe, ich habe die Klammer versehentlich gelöscht. –