2014-09-27 5 views
0

Я создал ниже программу для чтения данных, разделенных запятыми из файла, а затем вставляю их в структуры. Существует функция, называемая struct person insert_into_struct(char line[]). Когда я компилирую это, что функция в последний цикл p.Id[j]=line[i]; получил ошибкуСтрока 90: индексированное значение не является ни массивом, ни указателем, ни вектором

line 90 error: subscripted value is neither array nor pointer nor vector 

Это код

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

struct person{ 
    char name[100]; 
    char address[100]; 
    int Id; 
}; 

struct person insert_into_struct(char line[]); 

int main(int argc,char *argv[]){ 

    FILE *fp1; 
    fp1=fopen(argv[1],"r"); 

    char ch; 
    char line[100]; 
    int i=0; 

    struct person person_arry[100]; 
    int linenum=0; 
    if(fp1==0) 
    { 
     printf("Error\n"); 
    } 
    else 
    { 
     while((ch=fgetc(fp1))!=EOF){ 

     switch(ch){ 
      case '\n': 
       line[i]='\0'; 

       person_arry[linenum]=insert_into_struct(line); 
       printf("line:%d, name: %s, address: %s, id: %s\n", 
        linenum, 
        person_arry[linenum].name, 
        person_arry[linenum].address, 
        person_arry[linenum].Id); 
       linenum++; 
       i=0; 
       break; 
      default: 
       line[i]=ch; 
       i++; 
      } 
     } 

    } 
    return 0; 
} 

struct person insert_into_struct(char line[]){ 
    int i,j=0; 

    // now we have to declare a temp structre to hold the seperated values 
    struct person p; 

    //now split the values one by one. 
    //first copy the name from line[] into p.name 
    for(i=0; line[i]!=',';i++, j++){ 
     p.name[j]=line[i]; 
    } 
    i++; 
    p.name[j]='\0'; 
    //printf("name=%s\n", p.name); 

    //second copy the address in line[] to p.address[] 
    for(j=0 ; line[i]!=',';i++, j++){ 
     p.address[j]=line[i]; 
    } 
    i++; 
    p.address[j]='\0'; 
    //printf("address=%s\n", p.address); 

    // Erroneous line: 
    //third copy the id in line[] to p.id[] 
    for(j=0 ; line[i]!='\0';i++, j++){  
     p.Id[j]=line[i]; 
    } 
    p.Id[j]='\0'; 
    //printf("Id=%s\n", p.Id); 

    return(p); 
} 
+0

Вы пытаетесь сохранить 'Id' как строку символов. Сохраните его как 'int'. (Это предположение. Мне не хотелось подсчитывать, чтобы найти эту легендарную «линию 90».) – usr2564301

+0

Вам не нужно считать это. Вернитесь к элементу struct insert_into_struct (char line []), а затем запустите для него цикл. –

+0

Ну, я догадался, потому что эта строка содержит 'p.Id [j]' - где вы пытаетесь получить доступ к 'int Id' как указатель, массив или вектор". – usr2564301

ответ

0

Добавьте эту функцию в код, чтобы преобразовать строку в число (atoi функция):

int atoi(char* str) 
    { 
     if(!str) 
      printf("Enter valid string"); 

     int number = 0; 
     char* p = str; 

     while((*p >= '0') && (*p <= '9')) 
     { 
      number = number * 10 + (*p - '0'); 
      p++; 
     } 
     return number; 
    } 

, а затем реализовать это следующим образом:

вместо

for(j=0 ; line[i]!='\0';i++, j++){ 
     p.Id[j]=line[i]; 
    } 

пишут:

p.Id = atoi(line); 
+0

Есть ли другие решения. Потому что мне нужен Id как целое. Мне нужно сортировать идентификаторы после этого кода. –

+0

Мне не нужен массив int для одной структуры. Normal int Id для одной строки. –

+0

'atoi' - это правильная функция для использования, но с' atoi (line) 'вы читаете целое число от начала строки. – usr2564301

0

Я нашел простой способ. Я создал переменную под названием char g[100], а затем сохранил line[i] int до g[100]. Затем преобразовали g[] в p.Id.

char g[100]; 
for(j=0 ; line[i]!='\0';i++, j++){ 


     g[j]=line[i]; 
    } 
    g[j]='\0'; 
    p.Id=atoi(g); 
Смежные вопросы

 Смежные вопросы