使用c中的静态数组存储数据

时间:2014-05-01 13:53:22

标签: c arrays

首先,我的英语不够好,所以请原谅我的错误。 我需要使用静态数组保存/存储学生的姓名。我使用的是二维数组,行代表学生的班级,列代表学生的名字。

我还使用malloc将数据存储在Store_Student_Name()中。

所以我写了这段代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


char chrStudent[50][9];

void Store_Student_Name(int j, int k)  
{   
    char chrName[100];
    char *p_aux = (char*)malloc(strlen(chrName) + 1); 
    fgets(chrName, 100, stdin);
    strncpy(p_aux, chrName, strlen(chrName)+1);
    chrStudent[j][k]= p_aux;
}    


int main()
{   
    printf("Class 0, Student 1 Name: ");
    Store_Student_Name(0,0);
    printf("\n0,0 %s\n", chrStudent[0][0]);

    printf("Class 0, Student 2, Name: ");
    Store_Student_Name(0,1);
    printf("\n0,1 %s\n", chrStudent[0][1]);

    printf("Class 0, Student 3, Name: ");
    Store_Student_Name(0,2);
    printf("\n0,2 %s\n", chrStudent[0][2]);

    printf("Class 0, Student 4, Name: ");
    Store_Student_Name(0,3);
    printf("0,3 %s\n", chrStudent[0][3]);

    system("PAUSE");
    return 0;
}   

如果我写简短的名字,例如#34; Pedro&#34;,这个程序运行得很好,但如果我写了#34; Pedro Luis Samaniego Peralta&#34;这个程序崩溃了。

我做错了什么?

4 个答案:

答案 0 :(得分:0)

来自char chrStudent[50][9];的行只能有8个字符加上1个字符串终止符。

扩大品味;例如char chrStudent[50][/*bigger number here, say N*/];

(接下来,您可能希望将strncpy更改为N - 1的最大值。)

答案 1 :(得分:0)

嗯,char类型代表单个字符,而不是字符串。您需要3维数组来存储该数据,因为一个维度将用于存储字符串。您可以通过简单地创建不包含字符的二维表,但指向字符数组(字符串)来实现: char* chrStudent[50][9];

然后分配chrStudent[j][k]= p_aux;将是正确的。

答案 2 :(得分:0)

该行:

char chrStudent[50][9];  //name can be only 8 char long

如上所述,将包含50个名称长8个字符 或更少 。 (8个字符和1个空终止符)

如果您需要超过8个字符,则第二个索引必须更大:

char chrStudent[50][100];  //100 for example will provide for a name 99 char long.  

,因为chrName在调用此函数时尚未为分配值

char *p_aux = (char*)malloc(strlen(chrName) + 1);  

无法保证p_aux有多少空间。
将行更改为

char *p_aux = malloc(100);  //to match the value of the second index of `chrStudent[50][100]`.  

note :因为 C中的void指针可以分配给没有显式强制转换的任何指针,您不需要强制转换返回malloc()
discussion on this point

答案 3 :(得分:0)

试试这个

char *chrStudent[50][9];

void Store_Student_Name(int j, int k)  
{
    char chrName[100], *p_aux;
    int len;
    fgets(chrName, sizeof(chrName), stdin);
    len = strlen(chrName);
    if(len && chrName[len-1]=='\n')
        chrName[--len] = '\0';
    p_aux = malloc(len + 1); 
    strncpy(p_aux, chrName, len+1);
    chrStudent[j][k]= p_aux;
}