2013-12-03 4 views
-1

У меня возникли проблемы со следующим.Printf не печатает строку должным образом

Поскольку я довольно новичок в C, я не уверен, какие слова или термины я должен был искать в google. Так что мои извинения заранее.

Я упростил программу, чтобы сузить ее до актуальной проблемы.

Вот проблема:

выделяет память, прежде чем я вызвать функцию LoadFile. Я передаю указатель на loadfile() и выполняю код там. Затем я добавил несколько printfs, чтобы увидеть, работает ли код, как я ожидал.

Ну его нет: я бы сказал, что правильно настроил указатели, так как адрес, из которого стрелка указателя в функции путается, и адрес фактического массива структуры одинаковы.

Однако, когда я хочу напечатать строку item.name, на экран выводятся некоторые странные знаки. печатается только первый символ этой строки.

Может ли кто-нибудь помочь мне с этим?

main.c

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


int main() 
{ 
    int row=1, choice; 
    Cars* item=(Cars*)malloc(sizeof(Cars)); 
    char inName[64]; 


do 
{ 
     choice=printmenu();              /** Print menu and ask for choice **/ 
     switch (choice) 
     { 
     case 10:                /** choice 10 executes the loading function **/ 
      printf ("Enter name of file to be opened: "); 
      fflush(stdin); 
      scanf ("%63s", inName); 

      row=3; 
      item=(Cars*)realloc(item,(row*sizeof(Cars))); 
      loadfile(item,inName); 

      printf(" adress in main1: %d \n", &item[0].artno); 
      printf(" adress in main2: %d \n", &item[1].artno); 
      printf(" name1 in main: %c \n", item[0].name[0]); 
      printf(" name1 in main: %s \n", item[0].name);      /*!!! printing the string has completely unexpected behavior, see screenshot !!!*/ 

      break; 

     case 11: break; 
     } 

} while(choice!=11); 

getch(); 
return 0; 
} 

loadfile.c

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


void loadfile(Cars *load,char inName[63]) 
{ 
    char c,cartno[10]={},camount[10]={},cprice[10]={}; 
    FILE *in; 
    int i=0,sem=0,z=0 /*rows=0*/; 

    if ((in = fopen (inName, "r")) == NULL)        /** if file couldn't be found, return error message and return to menu **/ 
    { 
    printf ("Can't open %s for reading.\n", inName); 
    getch(); 
    return 0; 
    } 

    while ((c = getc (in)) != EOF)          /** read each character in file until end of file (EOF) is read **/ 
    { 
    if (c!=';')                /** evaluate if read character is a semicolone (semicolone separates entities in data-file **/ 
    { 
     if (sem==0) { cartno[z]=c;   z++; }     /** all characters before the first semicolone are numbers and saved to character string cartno **/ 
     if (sem==1) { (load+i)->name[z]=c; z++; }     /** all characters after first and before second semicolone are saved to item.name **/ 
     if (sem==2) { camount[z]=c;  z++; }     /** all characters after second and before third semicolone are saved to character string camount **/ 
     if (sem==3) { cprice[z]=c;   z++; }     /** all characters after third and before fourth semicolone are saved to character string cprice **/ 
     if (sem==4)               /** when fourth semicolone is reached cartno, camount and cprice is transformed to integer and floats with atoi,atof **/ 
     { sem=0; 
      (load+i)->artno=atoi(cartno); 
      (load+i)->amount=atoi(camount); 
      (load+i)->price=atof(cprice); 

      i++; 

      memset(cartno,0,sizeof(cartno));        /** all positions of the temp arrays are set to zero, in case of another loop **/ 
      memset(camount,0,sizeof(camount)); 
      memset(cprice,0,sizeof(cprice)); 

     } 
    }else    {sem++;     z=0; } 
} 

printf(" adress in loadfile1: %d \n", &(load)->artno); 
printf(" adress in loadfile2: %d \n", &(load+1)->artno); 
printf(" name1 in loadfile: %c \n", (load)->name[0]); 
printf(" name1 in loadfile: %s \n", (load)->name);       /*!!! printing the string has completely unexpected behavior, see screenshot !!!*/ 

fclose (in); 
printf ("File has been loaded.\n"); 
return 0; 
} 

printmenu.c

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

/** This function prints the menu **/ 

int printmenu() 
{ 
    int choice; 

    //system("cls"); 

    printf("[10]\tLoad file\n"); 
    printf("[11]\tQuit\n\n"); 

    printf("Please choose: "); 
    fflush(stdin); 
    scanf("%d",&choice); 

    return choice; 

} 

warehouse.h

#ifndef WAREHOUSE_H_INCLUDED 
#define WAREHOUSE_H_INCLUDED 

struct cars { 
    int amount, artno; 
    float price; 
    char name[20]; 

}; 

typedef struct cars Cars; 

int printmenu(); 
void loadfile(Cars *load,char inName[63]); 

#endif // WAREHOUSE_H_INCLUDED 

и здесь файл я загрузки:

1;Bier;11;12.00; 
2;Wodka;43;13.89; 
3;Rum;6;29.10; 

несчастливо я не разрешено загружать экраны струи, так что я должен был использовать экстерном хостера. http://www.imagebanana.com/view/1zisbkuf/strange.jpg

printf ("name1 in main:% s \ n", item [0] .name);

Я ожидаю печати f для печати: name1 в основном: bier Но он печатает странные знаки.

+4

Рассмотрите возможность создания [SSCCE] (http://sscce.org/). Очень немногие люди захотят просеять весь этот код. – Sinkingpoint

+1

По крайней мере, покажите пример неверного вывода и то, что вы ожидали от того же примера. – aschepler

+0

С одной стороны, кажется странным предположить определенный размер в файле перед тем, как открыть его 'row = 3', а затем сделать realloc, если бы вы знали размер, почему realloc?либо вы читаете запись файла по записи и realloc, когда это необходимо, либо вы все время хотите узнать все, что вам нужно, с тех пор, как вы уже знаете размер. –

ответ

0

Функция чтения файлов может быть намного проще. Изменить

while ((c = getc (in)) != EOF) 
{ 
    ...          
} 

в loadfile.c к

char buf[256]; 
while (fgets(buf, 255, in)) { 
    char *pch = strtok(buf, ";"); 
    load[i].artno=atoi(pch); 

    pch = strtok(NULL, ";"); 
    strcpy(load[i].name, pch); 

    pch = strtok(NULL, ";"); 
    load[i].amount = atoi(pch); 

    pch = strtok(NULL, ";"); 
    load[i].price = atof(pch); 

    i++; 
} 

Это предполагает, что загрузка файла в нужном формате и каждая запись в новой строке.

+0

'fgets (buf, 255, in)' вместо этого может быть 'fgets (buf, 256, in)' или еще лучше 'if (fgets (buf, sizeof buf, in)! = NULL)'. – chux

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