当我尝试在t[1].name
函数中读取equalname
的值时,它将无效。如何将该值发送到另一个函数?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
struct test {
char name[100];
char num[100];
};
int equalname(struct test *t, char string[100]) {
int i;
t = malloc(sizeof(struct test)*100);
printf("t[1].name == %s\n", t[1].name); //prints garbage(t[1].name != name)
for (i = 0; i < 100; i++) //also, is this even right?
{
if (t[i].name == string) //should I use 2 for's and set t[i].name[j] == string[j]?
{
printf("t[i].name == name!");
return i;
break;
}
}
printf("WRONG");
return 0;
}
int main() {
struct test *t;
t = malloc(sizeof(struct test)*100);
char name[100];
printf("Name:\n");
scanf("%s", name);
strcpy(t[1].name, name);
printf("t[1].name == %s\n", t[1].name); //this works (t[1].name == name)
equalname(t[1].name, name);
}
答案 0 :(得分:3)
好消息是你走在正确的轨道上 - 坏消息是你的赛道上有几条铁轨缺失......
首先,当您使用malloc
分配内存时,内存块将被保留,但块中的所有字节仍保持未初始化。尝试访问未初始化的内存位置中的任何内容是未定义的行为 - 从那一点开始,您的代码操作不再被定义 - 它可能看似起作用,也可能是SegFault或其间的任何内容。
你有两个选择,(1)循环遍历每个结构并显式初始化值,或(2)使用calloc
将所有字节分配并初始化为零,例如。
#define MAXN 100 /* if you need a constrant #define 1 (or more) */
struct test {
char name[MAXN];
char num[MAXN];
};
...
int main() {
int index;
struct test *t;
char name[MAXN] = "";
t = calloc(MAXN, sizeof *t); /* use calloc, or initialize values */
if (t == NULL) { /* validate every allocation */
perror ("calloc-t");
return 1;
}
请勿在{{1}}中再次分配t
。虽然由于C使用pass by值而不会覆盖原始地址,而equalname
是来自main的t
的副本 - 它也不会为您接受创建另一个未初始化的内存块。只需从t
传递t
并使用它,例如
main
接下来,您无法将字符串与int equalname (struct test *t, char *string)
{
int i;
printf("t[1].name == %s\n", t[1].name);
for (i = 0; i < MAXN; i++)
{ /* you must use strcmp to compare strings, not == */
if (strcmp (t[i].name, string) == 0)
{
printf ("t[i].name == name!\n");
return i;
break;
}
}
printf("WRONG");
return -1;
}
进行比较。你要么必须遍历每个字符并进行比较 - 或者只是使用==
(这就是它所写的内容),例如。
strcmp
接下来,您必须 验证 每个分配和每个用户输入 - 否则您将邀请未定义的行为。如果您无法验证分配并且无法验证输入 - 您可以放心,您实际上正在代码中的有效内存中处理有效数据。
完全放弃,您可以执行以下操作:
if (strcmp (t[i].name, string) == 0)
{
printf ("t[i].name == name!\n");
return i;
break; /* break does nothing here */
}
示例使用/输出
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXN 100 /* if you need a constrant #define 1 (or more) */
struct test {
char name[MAXN];
char num[MAXN];
};
int equalname (struct test *t, char *string)
{
int i;
printf("t[1].name == %s\n", t[1].name);
for (i = 0; i < MAXN; i++)
{ /* you must use strcmp to compare strings, not == */
if (strcmp (t[i].name, string) == 0)
{
printf ("t[i].name == name!\n");
return i;
break;
}
}
printf("WRONG");
return -1; /* on error return a value that cannot be a valid index */
}
int main() {
int index;
struct test *t;
char name[MAXN] = "";
t = calloc(MAXN, sizeof *t); /* use calloc, or initialize values */
if (t == NULL) { /* validate every allocation */
perror ("calloc-t");
return 1;
}
printf ("Name: ");
if (scanf ("%s", name) != 1) { /* validate ALL user input */
fprintf (stderr, "error: invalid input - name.\n");
return 1;
}
strcpy (t[1].name, name);
printf ("t[1].name == %s\n", t[1].name);
index = equalname (t, name); /* save the return! */
if (index == -1) { /* validate the operation of your function */
fprintf (stderr, "string '%s' not found.\n", name);
return 1;
}
printf ("string found at index '%d'.\n", index);
return 0;
}
如果您还有其他问题,请与我们联系。