2015-02-09 29 views
0

所以,我的目标是创建一个线性搜索,但我得到了这一点,我有一个访问字符串的问题该结构中,我一直在使用一个txt文件,所以在linearSearch()我试着这样做存储:C数组结构,试图访问数据,但是对于所有数组都提供相同的结果

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"); 
    } 
} 

回答

1

出现这种情况的,因为代码

q.name[i] = username; 

您不能分配使用=运营商的阵列的价值。在这里,您要为每个q.name[i]分配地址username。所以,username的最后一个值反映在整个阵列中。

实际需要的是使用malloc()分配内存,然后strcpy()复制字符串内容。

否则,你也可以利用strdup()

无论哪种方式,一旦完成使用,不要忘记free()分配的ememory。

+0

我现在有:strcpy(q.name [i],txtName);但它会出现分段错误? – MattSolo 2015-02-09 09:52:07

+1

@MattSolo'q.name [i] = strdup(username);',当你完成后别忘了'释放'它们。 – WhozCraig 2015-02-09 09:52:55

+0

@MattSolo在使用它之前,你需要使用'malloc()'将内存分配给'q.name [i]'。 – 2015-02-09 09:53:55

0

我可以看到你声明了char username[9],所以我假设你的名字长度不应超过8个字符。你应该:

  • 读有:fscanf(ifp, "%8s %d",&username, &score) == 2:在&是一个数组(好听衰变为指针)的前无用的,但你应该输入的极限尺寸 - 好吧,你的问题并非来自有
  • Word.name使用2D char数组而不是指针数组。这样,你的内存已经分配,​​您可以放心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进行动态分配,但在该ca你应该释放它。