2013-06-25 2 views
0

Я пытаюсь найти самое низкое значение в целочисленном массиве. Затем отобразите это значение с именем человека, у которого этот счет. Я могу найти, какое значение является наименьшим adn, отображающим его с индексом, таким как игрок 1 или игрок 2, но я не могу вместо него указать это имя.Как передать 2d массив строк в программировании на C?

#include <string.h> 
#include <stdio.h> 
#include <string.h> 
#define LEN_NAME 34 
#define NUM_NAMES 3 
void lowest(int array[], char *fullName, int elements); 
int main (void) { 
    int scores[NUM_NAMES] = { 230,330,423}; 
    char firstName[NUM_NAMES][LEN_NAME] = {"john","james","mario"}; 
    char lastName[NUM_NAMES][LEN_NAME] = {"goirgi", "edison", "luca"}; 
    char *fullName[NUM_NAMES][LEN_NAME]; 
    int i; 
    for (i=0; i < NUM_NAMES; i++) { 
     strcpy(fullName[i], firstName[i]); 
     strcat(fullName[i], " "); 
     strcat(fullName[i], lastName[i]); 
     printf("Your scores is %d with your full name is %s.\n",scores[i], fullName[i]); 
    } 

    lowest(scores,*fullName, NUM_NAMES); 
    return 0; 
} 

void lowest (int array[], char *fullName, int elements) { 
    int i,small = array[0], j; 
    for (i=0; i< elements; i++) { 
     if (array[i] < small) { 
      small = array[i]; 
      j = i; 
     } 
    } 
    printf("The lowest scored %d with score %d.\n", j , small); 
} 
+1

Вы попробовали 'fullName [j]'? – SheetJS

ответ

1

firstName, lastName и fullName являются смежными областями памяти, которые обрабатываются как (LEN_NAME x NUM_NAMES). Когда вы передаете их arround, вызываемая функция должна знать длину строки (LEN_NAME), так что, когда она индексируется на i (fullName[i]), она будет выполнять расчет fullName + (i * LEN_NAME) (здесь fullName - это адрес начала области памяти), чтобы он дойдет до начала i-го имени.

#include <string.h> 
#include <stdio.h> 
#include <string.h> 
#define LEN_NAME 34 
#define NUM_NAMES 3 
void lowest(int array[], char fullName[][LEN_NAME], int elements); 
int main(void) 
{ 
    int scores[NUM_NAMES] = { 230, 330, 423 }; 
    char firstName[NUM_NAMES][LEN_NAME] = { "john", "james", "mario" }; 
    char lastName[NUM_NAMES][LEN_NAME] = { "goirgi", "edison", "luca" }; 
    char fullName[NUM_NAMES][LEN_NAME]; 
    int i; 
    for (i = 0; i < NUM_NAMES; i++) { 
     strcpy(fullName[i], firstName[i]); 
     strcat(fullName[i], " "); 
     strcat(fullName[i], lastName[i]); 
     printf("Your scores is %d with your full name is %s.\n", scores[i], 
       fullName[i]); 
    } 

    lowest(scores, fullName, NUM_NAMES); 
    return 0; 
} 

void lowest(int array[], char fullName[][LEN_NAME], int elements) 
{ 
    int i, small = array[0], j = 0; 
    for (i = 0; i < elements; i++) { 
     if (array[i] < small) { 
      small = array[i]; 
      j = i; 
     } 
    } 
    printf("%s scored %d.\n", fullName[j], small); 
} 

Это, как правило, более идиоматическое сделать массивы указателей символов для этой ситуации:

char *fullName[NUM_NAMES]; 
fullName[0] = malloc(LEN_NAME); 
// ... 

Вы можете вспомнить их длину или поставить NULL указатель в последней позиции. Если вы сделаете это, вам нужно будет объявить lowest как:

void lowest(int array[], char *fullName[], int elements); 
+0

Спасибо, это сработало :) – user2512806

0

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

0

Я думаю, что это опечатка:

char *fullName[NUM_NAMES][LEN_NAME]; 
    ^

Здесь вы объявили двумерный массив указателей, но вы не указали их ни к чему.