unexpected character displayed infront of the variable

E

ehabaziz2001

My Program turned a char variable into string using null character but
unexpected character displayed infront of the variable after using
printf .

Syntax :
-------------
#include <stdio.h>

struct record
{
char cust_name[50];
int cust_no;
int week_no;
char type;
float type_value;
float bill;
};


void invoice_entry(struct record *);
void print_invoice(struct record *);

char another(void);


void main(void)
{
struct record cust;

do
{
system("cls");
invoice_entry(&cust);
print_invoice(&cust);


} while (another()=='y');
}

void invoice_entry(struct record *cust)
{
int i=0;
printf ("Enter the Customer name : ");
do
{
i++;
(*cust).cust_name=getchar();
} while ((*cust).cust_name!='\n');
(*cust).cust_name[i+1]='\0';



printf("Enter the customer number : ");
scanf("%4d",&(*cust).cust_no);
printf("Enter the weeks number : ");
scanf("%4d",&(*cust).week_no);
printf("Enter type option 1 FOR \"1.5\" 2 FOR \"2.5\" 3 FOR
\"3.5\" : ");
scanf("\n%c",&(*cust).type);
switch ((*cust).type)
{
case '1':
(*cust).type_value=1.5;
break;
case '2':
(*cust).type_value=2.5;
break;
case '3':
(*cust).type_value=3.25;
break;
default :
break;
}

(*cust).bill=(*cust).type_value*(*cust).week_no;
}

void print_invoice(struct record *cust)
{
printf("\n");
printf("Invoice\n");
printf("------- ");
printf("\nCust# CustName Weeks# TypeValue
Bill \n");
printf ("----- -------- ------ ---------
---- \n");
printf ("%-4d %-40s %-4d %-4.2f
L.E %-4.2f",(*cust).cust_no,(*cust).cust_name,
(*cust).week_no,(*cust).type_value,(*cust).bill);
}


char another(void)
{
char ans;
printf("\n\nEnter another customer (y/n) : ");
scanf("\n%c",&ans);
return (ans);
}



Output:
----------
Enter the Customer name : 6667yy
Enter the customer number : 7
Enter the weeks number : 8
Enter type option 1 FOR "1.5" 2 FOR "2.5" 3 FOR "3.5" : 2

Invoice
-------
Cust# CustName Weeks# TypeValue Bill
----- -------- ------ --------- ----
7 ├6667yy
8 2.50
L.E 20
..00

Enter another customer (y/n) : n
E:\programs\unix\c_lang\iti01\ch07\own>
 
U

user923005

On Mar 23, 12:35 pm, (e-mail address removed) wrote:
[snip]
do
{
i++;
(*cust).cust_name=getchar();} while ((*cust).cust_name!='\n');


do {
(*cust).cust_name[i++] = getchar();
} while ((*cust).cust_name != '\n');

Or better yet (by far):

fgets(cust->cust_name, sizeof cust->cust_name, stdin);

[snip]
 
U

user923005

On Mar 23, 12:35 pm, (e-mail address removed) wrote:
[snip]
do
{
i++;
(*cust).cust_name=getchar();} while ((*cust).cust_name!='\n');


do {
(*cust).cust_name[i++] = getchar();
} while ((*cust).cust_name != '\n');

Or better yet (by far):

fgets(cust->cust_name, sizeof cust->cust_name, stdin);

[snip]


Probably better yet is Jack Klein's getsafe() function, which will
remove the trailing newline character:

#include <stdio.h>
#include <string.h>
char *getsafe(char *buffer, int count)
{
char *result = buffer, *np;
if ((buffer == NULL) || (count < 1))
result = NULL;
else if (count == 1)
*result = '\0';
else if ((result = fgets(buffer, count, stdin)) != NULL)
if (np = strchr(buffer, '\n'))
*np = '\0';
return result;
}
 
E

ehabaziz2001

using the above method I had to press enter more than one time . Pls
adjust the above the method using getchar() :
do {
(*cust).cust_name[i++] = getchar();
} while ((*cust).cust_name != '\n');


On Mar 23, 12:35 pm, (e-mail address removed) wrote:
[snip]
do
{
i++;
(*cust).cust_name=getchar();} while ((*cust).cust_name!='\n');


do {
(*cust).cust_name[i++] = getchar();
} while ((*cust).cust_name != '\n');

Or better yet (by far):

fgets(cust->cust_name, sizeof cust->cust_name, stdin);

[snip]
 
B

Barry Schwarz

On Mar 23, 12:35 pm, (e-mail address removed) wrote:
[snip]
do
{
i++;
(*cust).cust_name=getchar();} while ((*cust).cust_name!='\n');


do {
(*cust).cust_name[i++] = getchar();
} while ((*cust).cust_name != '\n');


This invokes undefined behavior. By incrementing i inside the do
block, you guarantee that the while clause tests an element of
cust_name that has not yet received a value. Attempting to evaluate
an indeterminate value is prohibited.
Or better yet (by far):

fgets(cust->cust_name, sizeof cust->cust_name, stdin);

[snip]


Remove del for email
 
B

Barry Schwarz

using the above method I had to press enter more than one time . Pls
adjust the above the method using getchar() :
do {
(*cust).cust_name[i++] = getchar();
} while ((*cust).cust_name != '\n');


Please don't top post. Insert your text at the appropriate point in
the quoted material or at the end.

Since user923005's code inovkes undefined behavior, don't use it.
On Mar 23, 12:35 pm, (e-mail address removed) wrote:
[snip]
do
{
i++;
(*cust).cust_name=getchar();} while ((*cust).cust_name!='\n');


do {
(*cust).cust_name[i++] = getchar();
} while ((*cust).cust_name != '\n');

Or better yet (by far):

fgets(cust->cust_name, sizeof cust->cust_name, stdin);

[snip]




Remove del for email
 
C

CBFalconer

using the above method I had to press enter more than one time .
Pls adjust the above the method using getchar() :
do {
(*cust).cust_name[i++] = getchar();
} while ((*cust).cust_name != '\n');


Don't top-post. By so doing you have lost all context.

Try:
int ch;

while ((EOF != (ch = getchar)) && ('\n' != ch)) {
if (i < SOMEMAXINDEX) cust->cust)name[i++] = ch;
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top