Quiero copiar mi matriz en un puntero, para poder ordenar la matriz sin cambiar el original. No recibo ningún error y estoy en un callejón sin salida. Intenté imprimir el contenido del puntero, pero siempre son datos no deseados. Si alguien pudiera ayudarme sería muy apreciado.
#include <stdio.h>
void bubbleSort(char *array[], int arrIndex);
void displaySort (char *array[], int arrIndex);
int main (void)
{
int index;
int count = 0;
printf("Enter number of people (0 - 50): ");
scanf("%d", &index);
index -= 1;
char userLastFirst[25][index];
int userAge[index];
//defining pointer
char *namePtr[25][index];
//do while loop, loops while count is less than or equal to the index
do{
printf("Enter name %d (last, first): ", count);
scanf(" %[^\n]s", userLastFirst[count]);
printf("Enter age %d: ", count);
scanf("%d", &userAge[count]);
// printf("\n\n%s %d\n\n", userLastFirst[count], userAge[count]);
count++;
} while (count <= index);
//assigning values to pointer
for(int i = 0; i < index; i++){
namePtr[25][i] = &userLastFirst[25][i];
}
//does not print values of pointer
for(int i = 0; i < index; i++){
printf("value of ptr[%d] = %s\n", i, namePtr[i]);
}
bubbleSort(*namePtr, index);
displaySort(*namePtr, index);
return 0;
}
void bubbleSort(char *array[], int arrIndex)
{
for (unsigned int pass = 0; pass < arrIndex - 1; ++pass) {
for (int i = 0; i < arrIndex - 1; ++i) {
if (array[i] < array[i + 1]) {
int temp = *array[i];
*array[i] = *array[i + 1];
*array[i + 1] = temp;
}
}
}
}
void displaySort(char *array[], int arrIndex)
{
for(int i = 0; i < arrIndex; i++){
printf("%s",*array[i]);
}
}
Lo siento, es mucho, pero he buscado por todas partes y no estoy exactamente seguro de cuál es el problema. Sospecho que es cómo paso los punteros a través de las funciones, o cómo estoy usando *
, &
pero no estoy totalmente seguro de lo que estoy haciendo mal. El bucle for debajo del que asigna los valores de matriz al puntero es para probar. Se supone que debe imprimir los valores que le di en el bucle for anterior, pero no lo hace. Solo imprime datos basura.
Solución del problema
Hay un par de problemas aquí, y dado que no sé exactamente cómo quiere que se vea su código final, voy a dar algunos ejemplos de lo que está mal y cómo podría solucionarlo.
char userLastFirst[25][index];
Esto debería ser
char userLastFirst[index][25];
No desea 25 personas con nombres de hasta 25 caracteres en ellos, sino más bien indexar personas con nombres de hasta 25 caracteres en ellos.
char *namePtr[25][index];
debiera ser
char namePtr[index][25];
Igual que antes + no necesita el * aquí. Ya que decidiste ir con vla, sigamos con eso. Usaría * y más específicamente char **
si fuera con malloc
/ calloc
.
namePtr[25][i] = &userLastFirst[25][i];
en lugar de hacer esta copia incómoda, intente:
strcpy(namePtr[i], userLastFirst[i]);
copia la cadena completa para usted, en lugar de solo un carácter. Necesitarás #include
la <string.h>
biblioteca para eso.
void bubbleSort(char *array[], int arrIndex)
El primer argumento de clasificación de burbuja debería ser:
char array[][25] // the same in displaySort
si quieres hacerlo sin la molestia de malloc
/ calloc
. Y tampoco vayas con int
tu temp
tipo. Más bien hazlo char temp[25]
y cópialo con strcpy
. Y no compare cadenas con <
, no funciona en C. Úselo strcmp
para eso. Y eso es todo por hacerlo sin malloc
/ calloc
, aquí hay un código de ejemplo:
#include <stdio.h>
#include <string.h>
void bubbleSort(char array[][25], int size);
void displaySort(char array[][25], int size);
int main (void)
{
int num_of_people;
printf("Enter number of people (0 - 50): ");
scanf("%d", &num_of_people);
char original_array[num_of_people][25];
char copied_array[num_of_people][25];
for (int i = 0; i < num_of_people; i++) {
printf("Enter name %d (last, first): ", i);
scanf(" %[^\n]s", original_array[i]);
}
for(int i = 0; i < num_of_people; i++){
strcpy(copied_array[i], original_array[i]);
}
bubbleSort(copied_array, num_of_people);
displaySort(copied_array, num_of_people);
return 0;
}
void bubbleSort(char array[][25], int size)
{
for (int i = 0; i < size - 1; ++i) {
for (int j = 0; j < size - 1 - i; ++j) {
if (strcmp(array[j], array[j + 1]) > 0) {
char temp[25];
strcpy(temp, array[j]);
strcpy(array[j], array[j + 1]);
strcpy(array[j + 1], temp);
}
}
}
}
void displaySort(char array[][25], int size)
{
for(int i = 0; i < size; i++){
printf("%s\n",array[i]);
}
}
y el programa funciona así:
Enter number of people (0 - 50): 4
Enter name 0 (last, first): Kowalski, Jan
Enter name 1 (last, first): Kowalska, Anna
Enter name 2 (last, first): Nowak, Miłosz
Enter name 3 (last, first): Amper, Ohm
Amper, Ohm
Kowalska, Anna
Kowalski, Jan
Nowak, Miłosz
Espero que esto sea algo que quisieras lograr.
No hay comentarios.:
Publicar un comentario