2015-09-03 77 views
0

我是编程新手,搜索和搜索后,我得到了一些代码来工作(部分),我可以创建一个结构但我无法打印字符串字段:/ C - 结构数组的printf字符串

#include <stdio.h> 
#define MAX 100 

struct vehiculos{ 
float peso; 
int hora; 
char *id; 
int ferry; 
}; 

void asignar(struct vehiculos llegada[MAX] ...) { // Here i have more parameters, but they are useless in this question... 
    int id,i; 
    i=0; 
    while(!feof(input_file)){ 
    fscanf(input_file,"%f %d %s %d",&llegada[i].peso,&llegada[i].hora,id,&llegada[i].ferry); 
    llegada[i].id = id; 
    i++; 
    } 
} 

int main(){ 

    struct vehiculos llegada[MAX]; 
    FILE *entrada; 
    entrada = fopen("proy1.txt","r"); 
    asignar(llegada...); 

return 0; 
} 

我的问题是,一切工作正常,在“asignar”功能,但如果我试图打印车辆的ID外功能,它只是打印垃圾值,但其他值如比索,霍拉和渡轮打印正确(功能外)

此作品:

void asignar(...){ 
    ... 
    printf("%s", llegada[i].id); 
    ... 
} 

这不起作用:

int main(){ 
    ... 
    printf("%s", llegada[i].id); 
    ... 
} 

而且我的编译器说有在代码中没有错误,所以我不知道什么是这里的问题

谁能帮助我?这将是伟大的,谢谢:)

+2

您遇到不确定的行为。你没有分配'id'。另外,看看[**为什么是“while(!feof(file))”总是错误的?**](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-错误)。 –

+1

你正在尝试'llegada [i] .id = id;'将'int'赋给'char *' – snr

+2

你的文件读取循环是错误的:http://stackoverflow.com/questions/5431941/while-feof-file - 是总是错的 – Barmar

回答

0

在最好的情况下,你可能会得到一些随机垃圾。但是,最有可能你的程序只会发生段错误:你的代码声明了id,但是没有为它分配空间。

您需要将其声明为 char id[IDLEN] 但随后,id读取该文件是一个char*当你并试图将其分配给llegada[i].id时,编译器会抱怨。

为此,您需要使用string.h库进行字符串复制。

以下代码有效。

#include <stdio.h> 
#include <string.h> 
#define MAX 100 
#define IDLEN 80 
struct vehiculos{ 
float peso; 
int hora; 
char id[IDLEN]; 
int ferry; 
}; 

void asignar(struct vehiculos llegada[MAX], FILE* input_file) { // Here i have more parameters, but they are useless in this question... 
    char id[IDLEN]; 
    int i; 
    i=0; 
    while(!feof(input_file)){ 
    fscanf(input_file,"%f %d %s %d",&llegada[i].peso,&llegada[i].hora,id,&llegada[i].ferry); 
    strcpy(llegada[i].id , id); 
    i++; 
    } 
} 

int main(){ 

    struct vehiculos llegada[MAX]; 
    FILE *entrada; 
    entrada = fopen("proy1.txt","r"); 
    asignar(llegada,entrada); 
    printf("%s\n",llegada[0].id); 

return 0; 
} 
+0

谢谢,这工作无瑕 – Macr1408

0

首先,你声明id为int而不是char *。

现在,当声明一个指针时,一些编译器会给它赋值null,那就是你的情况。 当你这样做:llegada[i].id = id;它实际上并没有指定字符串指针,而应该分配空间(malloc或类似的),并使用strcpy。

用空指针创建结构后,您正在尝试打印它。所有“扁平”成员,如int将被打印得很好,但是你的字符串,因为它是一个指针将不会打印任何东西,所以printf("%s", llegada[i].id);不会做任何事情

+0

嗯,我知道了它的队友,谢谢,我是新手指针,但这...这可以帮助我很多 – Macr1408

0

您可以根据需要为它分配空间,而不是静态声明id。以下示例显示使用fgetssscanf来处理读取和解析每行读取。与fscanf相比,它有几个优势(特别是在这里允许您根据需要读取和分配id)。让我知道如果您有任何疑问:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define MAX 100 
#define MAXL 256 

struct vehiculos { 
    float peso; 
    int hora; 
    char *id; 
    int ferry; 
}; 

void asignar (struct vehiculos *llegada, FILE *fp, int *idx) 
{        // Here i have more parameters, but they are useless in this question... 
    char line[MAXL] = {0}; 
    char idbuf[MAXL] = {0}; 

    while (fgets (line, MAXL, fp)) { 

     sscanf (line, "%f %d %s %d", &llegada[*idx].peso, &llegada[*idx].hora, 
       idbuf, &llegada[*idx].ferry); 

     llegada[*idx].id = strdup (idbuf); 

     (*idx)++; 
    } 

//  while (!feof (input_file)) { 
//   fscanf (input_file, "%f %d %s %d", &llegada[i].peso, &llegada[i].hora, 
//     id, &llegada[i].ferry); 
//   llegada[i].id = id; 
//   i++; 
//  } 

} 

int main (int argc, char **argv) 
{ 
    FILE *entrada = argc > 1 ? fopen (argv[1], "r") : stdin; 
    if (!entrada) { 
     fprintf (stderr, "error: failed to open input for reading.\n"); 
     return 1; 
    } 

    int i, n = 0; 
    struct vehiculos llegada[MAX] = {{0,0,NULL,0}}; 

    asignar (llegada, entrada, &n); 

    if (entrada != stdin) fclose (entrada); 

    for (i = 0; i < n; i++) 
     printf (" llegada[%2d] peso: %3.2f hora: %2d id: %8s ferry: %d\n", 
       i, llegada[i].peso, llegada[i].hora, llegada[i].id, llegada[i].ferry); 

    for (i = 0; i < n; i++) 
     free (llegada[i].id); 

    return 0; 
} 

采样输入

$ cat dat/vehiculos.txt 
6.80 4 sal_135 2 
8.20 3 jim_023 4 
5.45 5 sam_101 6 
6.75 3 bil_002 16 

示例输出

$ ./bin/struct_no_alloc dat/vehiculos.txt 
llegada[ 0] peso: 6.80 hora: 4 id: sal_135 ferry: 2 
llegada[ 1] peso: 8.20 hora: 3 id: jim_023 ferry: 4 
llegada[ 2] peso: 5.45 hora: 5 id: sam_101 ferry: 6 
llegada[ 3] peso: 6.75 hora: 3 id: bil_002 ferry: 16