У меня возникли проблемы со следующим.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 Но он печатает странные знаки.
Рассмотрите возможность создания [SSCCE] (http://sscce.org/). Очень немногие люди захотят просеять весь этот код. – Sinkingpoint
По крайней мере, покажите пример неверного вывода и то, что вы ожидали от того же примера. – aschepler
С одной стороны, кажется странным предположить определенный размер в файле перед тем, как открыть его 'row = 3', а затем сделать realloc, если бы вы знали размер, почему realloc?либо вы читаете запись файла по записи и realloc, когда это необходимо, либо вы все время хотите узнать все, что вам нужно, с тех пор, как вы уже знаете размер. –