Двумерный массив в C - PullRequest
0 голосов
/ 20 июня 2011

Мне нужно сохранить имена пяти учеников в двумерном массиве.Имя каждого студента может быть длиной до 20 символов.Если пришла шестая запись студента, то первая будет заменена, седьмая - второй и т. Д.

Ниже приведена моя программа.Пожалуйста, дайте мне знать, когда я вызываю функцию set (чтобы добавить запись ученика в двумерный массив) для второго ученика, почему моя первая запись ученика заменяется.Однако все равно это не помогает.Пожалуйста, предложите.

#include <stdio.h>
#include<strings.h>

void display(char s[][21]);

void set(char stuName[][21],char* merchantNo)
{

        for(int i = 0;i<5;i++)
        {
                if(stuName[i][21] == '\0')
                {
                        strcpy(stuName[i], merchantNo);
                        break;
                }
        }
}

void display(char s[][21])
{
    for(int i = 0;i<5;i++)
        {
        printf("s[%d] is [%s]\n",i,s[i]);
        }
}

int main()
{
        char stuName[5][21];

        printf("sizeof(stuName) is [%d]\n",sizeof(stuName));

        memset(stuName,'\0',sizeof(stuName));

        display(stuName);

        set(stuName,"Student1");
        display(stuName);

        set(stuName,"Student2");

        display(stuName);

        return 0;
}

Вывод

s[0] is []
s[1] is []
s[2] is []
s[3] is []
s[4] is []
s[0] is [Student1]
s[1] is []
s[2] is []
s[3] is []
s[4] is []
s[0] is [Student2]
s[1] is []
s[2] is []
s[3] is []
s[4] is []

Ответы [ 4 ]

3 голосов
/ 07 декабря 2012

Похоже, вам нужно изменить функцию set на что-то вроде:

int set(char stuName[][21], char* merchantNo)
{
    int l = strlen(merchantNo);
    if (21 <= l) // input name is greater than your array
       return -1;

    for (int i = 0; i < 5; i++)
    {
        if (stuName[i][0] == '\0')
        {
            strncpy(stuName[i], merchantNo, l);
            return i; // return the position where you've added
        }
    }
    return -2;  // array full, can't add new entry
}
1 голос
/ 20 июня 2011
char stuName[4][21];

Это должно быть char stuName[5][21], если предполагается, что вы сможете хранить имена для 5 студентов.

Кроме того, ваш тест на пустое имя неверен:

if(stuName[i][21] == 0x00)
    strcpy(stuName[i], merchantNo);

Это должно быть что-то вроде stuName[i][0] == 0.

И break после этих строк всегда будет выполняться, поэтому вы никогда не пройдете цикл for в set() более одного раза. Вот что вызвало проблему, о которой вы упомянули.

Другое дело: будьте осторожны при использовании strcpy. Слишком длинное имя вызовет странные вещи. Возможно, вы захотите взглянуть на strncpy .

1 голос
/ 20 июня 2011

Если у вас есть пять имен учеников, вы должны объявить массив из пяти:

char stuName[5][21];

Помните, что массив N, T x[N], имеет действительные члены x[0] до x[N-1].

0 голосов
/ 20 июня 2011

Вы хотите проверить stuName [i] [20], stuName [i] [21], чтобы увидеть, является ли последний символ нулевым. Тем не менее, даже когда вы пишете имя, последний символ по-прежнему нулевой. Вам понадобится какой-то счетчик, чтобы проверить, какое у вас имя.

Кроме того, функция if в функции set должна иметь фигурные скобки для включения разрыва, в противном случае она всегда будет разрываться при i = 0.

...