C 数组结构,试图访问数据,但对所有数组都一样
C Array struct, trying to access data, but is coming up with the same for all arrays
所以,我的目标是创建一个线性搜索,但我已经很失望了,我在从结构中访问字符串时遇到了一个问题,我使用 txt 文件存储了这些字符串,所以在 linearSearch()
我试过这样做:
printf("Name: %s \n", q.name[i]);
printf("Data: %d \n", q.data[i]);
data
会很完美,但 name
只会为每个数组打印出相同的名称,这将是我放入数组的最后一项。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char* name[10];
int data[10];
}Word;
//int bubblesort (Word word);
void linearSearch(char* name, Word q);
int main (int argc, const char *argv[]){
Word q;
char username[9]; /* One extra for nul char. */
int score;
int i = 0;
FILE *ifp, *ofp;
ifp = fopen("Data.txt", "r");
while (fscanf(ifp, "%s %d", &username, &score) == 2) {
q.name[i] = username;
printf ("Name: %s, I = %d \n", q.name[i], i);
q.data[i] = score;
printf ("Data: %d, I = %d \n", q.data[i], i);
i++;
}
linearSearch("Matt", q);
return EXIT_SUCCESS;
}
void linearSearch(char* name, Word q){
int i = 0;
int foundIt = 0;
int numNames = sizeof(&q.name);
while ((foundIt == 0) && (i <= numNames)){
printf("Name: %s \n", q.name[i]);
printf("Data: %d \n", q.data[i]);
if ((strcmp(name, q.name[i]) != 0)){
i = i + 1;
} else {
foundIt = 1;
}
}
if (foundIt == 1){
printf("Name found at position %d", i);
} else {
printf("Required person not found");
}
}
发生这种情况是因为代码
q.name[i] = username;
您不能使用 =
运算符为数组赋值。在这里,您将 username
的地址分配给每个 q.name[i]
。因此,username
的最后一个值反映在整个数组中。
你真正需要的是使用malloc()
分配内存,然后strcpy()
复制字符串内容。
否则,您也可以使用strdup()
。
无论哪种方式,不要忘记 free()
使用完分配的内存。
我看到你声明了 char username[9]
,所以我假设你的名字最多 8 个字符。你应该:
- 阅读:
fscanf(ifp, "%8s %d",&username, &score) == 2
:&
在数组前毫无用处(它很好地衰减为指针),但你 应该 限制输入的大小 - 好的,你的问题不是来自那里
对 Word.name
使用二维字符数组而不是指针数组。这样你的内存就已经分配好了,你可以安全地 strcpy
:
typedef struct {
char name[10][9];
int data[10];
}Word;
然后:
strcpy(q.name[i], username); /* safe because qname[i] and username are both [9] */
这里的规则是始终控制在写入字符数组时不要冒缓冲区溢出的风险/
另一种方法是通过 strdup
进行动态分配,但在这种情况下,您应该释放它。
所以,我的目标是创建一个线性搜索,但我已经很失望了,我在从结构中访问字符串时遇到了一个问题,我使用 txt 文件存储了这些字符串,所以在 linearSearch()
我试过这样做:
printf("Name: %s \n", q.name[i]);
printf("Data: %d \n", q.data[i]);
data
会很完美,但 name
只会为每个数组打印出相同的名称,这将是我放入数组的最后一项。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char* name[10];
int data[10];
}Word;
//int bubblesort (Word word);
void linearSearch(char* name, Word q);
int main (int argc, const char *argv[]){
Word q;
char username[9]; /* One extra for nul char. */
int score;
int i = 0;
FILE *ifp, *ofp;
ifp = fopen("Data.txt", "r");
while (fscanf(ifp, "%s %d", &username, &score) == 2) {
q.name[i] = username;
printf ("Name: %s, I = %d \n", q.name[i], i);
q.data[i] = score;
printf ("Data: %d, I = %d \n", q.data[i], i);
i++;
}
linearSearch("Matt", q);
return EXIT_SUCCESS;
}
void linearSearch(char* name, Word q){
int i = 0;
int foundIt = 0;
int numNames = sizeof(&q.name);
while ((foundIt == 0) && (i <= numNames)){
printf("Name: %s \n", q.name[i]);
printf("Data: %d \n", q.data[i]);
if ((strcmp(name, q.name[i]) != 0)){
i = i + 1;
} else {
foundIt = 1;
}
}
if (foundIt == 1){
printf("Name found at position %d", i);
} else {
printf("Required person not found");
}
}
发生这种情况是因为代码
q.name[i] = username;
您不能使用 =
运算符为数组赋值。在这里,您将 username
的地址分配给每个 q.name[i]
。因此,username
的最后一个值反映在整个数组中。
你真正需要的是使用malloc()
分配内存,然后strcpy()
复制字符串内容。
否则,您也可以使用strdup()
。
无论哪种方式,不要忘记 free()
使用完分配的内存。
我看到你声明了 char username[9]
,所以我假设你的名字最多 8 个字符。你应该:
- 阅读:
fscanf(ifp, "%8s %d",&username, &score) == 2
:&
在数组前毫无用处(它很好地衰减为指针),但你 应该 限制输入的大小 - 好的,你的问题不是来自那里 对
Word.name
使用二维字符数组而不是指针数组。这样你的内存就已经分配好了,你可以安全地strcpy
:typedef struct { char name[10][9]; int data[10]; }Word;
然后:
strcpy(q.name[i], username); /* safe because qname[i] and username are both [9] */
这里的规则是始终控制在写入字符数组时不要冒缓冲区溢出的风险/
另一种方法是通过 strdup
进行动态分配,但在这种情况下,您应该释放它。