首先,我的英语不够好,所以请原谅我的错误。 我需要使用静态数组保存/存储学生的姓名。我使用的是二维数组,行代表学生的班级,列代表学生的名字。
我还使用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;这个程序崩溃了。
我做错了什么?
答案 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;
}