我对C很陌生并且可能做了一些愚蠢的事情,但我无法找出为什么我的字符串数组不保留以前的值而等级保持输入所有值:
for(int i=0; i <noOfStudents; i++)
{
do{
printf("Please enter Student Full Name.");
//read string till enter
scanf(" %[^\n]", &studentFullName);
if(studentFullName == "")
{
printf("Invalid Student Name!\n\n");
getchar();
}
else
{
names[i] = studentFullName;
validStudentName = 1;
}
}while(validStudentName != 1);
do{
printf("Please enter Student Grade.");
scanf_s(" %d", &grade);
if(grade < -1 && grade >100)
{
printf("Invalid Student Grade!\n\n");
getchar();
}
else
{
grades[i] = grade;
validGrade = 1;
}
}while(validGrade != 1);
printf("\n");
}
答案 0 :(得分:2)
简而言之,指针。您只是为names
数组中的每个元素分配相同的指针。您需要为每个字符串分配单独的字符串。
此外,您有一个错误:studentFullName == ""
永远不会返回true。您应该使用strcmp(studentFullName, "") == 0
。
哦,此外,您应该使用scanf(" %[^\n]", studentFullName);
,而不使用引用运算符,因为否则您正在使用内存做一些令人难以置信的未定义,假设studentFullName
被分配为char *
}。
答案 1 :(得分:1)
您必须使用strcmp
或stricmp
来比较C中的字符串,因为studentFullName
只是内存中字符缓冲区开头的位置。
写下来是无效的:
if(studentFullName == "")
相反,你可以写
if(strcmp(studentFullName, ""))
同样地,names[i] = studentFullName;
没有制作studentFullName
的副本,它将names[i]
设置为指向studentFullName
缓冲区,每次循环时都会覆盖该缓冲区。
要复制“字符串”(或更好地将其视为字符缓冲区),您应该使用strcpy
。
答案 2 :(得分:1)
grade
是一个整数。当你这样做时:
int a;
int b = 3;
a = b;
b = 4;
然后a
继续为3,因为复制了整数。
studentFullName是一个指针。就像整数一样,指针也会被复制。但是,指针指向的数据不是。所以,基本上,你已经把你的整个名字[]数组作为一堆指针,都指向完全相同的数据。
有几个函数会为您复制指向数据,您正在寻找的数据可能是strdup
。请注意,您必须free
从strdup
获得的所有指针。
答案 3 :(得分:1)
你写道:
if(grade < -1 && grade >100)
我认为你希望得到-1到100之间的等级。“&amp;&amp;”意思是“和”, 作为你的代码,它意味着等级应小于“-1”且大于“100” 同一时间。所以,它总是等于:
if (false)
所以“else”条件总是在运行。