我正在处理一个问题,保存商店库存的证据,这里有一个部分,它被要求得到产品的代码,我必须通过倒换产品的名称来得到。
例如:
name of the product : snack
codebar: kcans而且每件事情都很好,直到它到达了与strcpy的线。
菜单不是英文的,但是第一个菜单得到输入,第二个菜单显示输出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Product
{
char productName[30];
char productCode[30];
int price;
int stock;
int date[3];
}P;
char* reverse(char *name)
{
char aux[30];
int i,j;
for(i = strlen(name) - 1, j = 0; i >= 0; i--,j++)
{
aux[j] = name[i];
}
aux[j] = '\0';
return aux[30];
}
int nameValidation(char *name)
{
int i;
for(i = 0; i < strlen(name); i++)
{
if(name[i] >= 'a' && name[i] <= 'z');
else
{
return 0;
break;
}
}
if(i == strlen(name))
return 1;
}
void input(P *product, int *n)
{
(*n)++;
do
{
printf("Product name: ");
scanf("%s", (product + *n)->productName);
} while (!nameValidation((product + *n)->productName));
printf("Price: ");
scanf("%d", &(product + *n)->price);
printf("Quantity: ");
scanf("%d", &(product + *n)->sotck);
do
{
printf("Expiration day: ");
scanf("%d", &(product + *n)->date[0]);
if((product + *n)->date[0] >= 1 && (product + *n)->date[0] <= 30)
break;
} while (1);
do
{
printf("Expiration month: ");
scanf("%d", &(product + *n)->date[1]);
if((product + *n)->date[1] >= 1 && (product + *n)->date[1] <= 12)
break;
} while (1);
(product + *n)->date[2] = 2024;
printf("Expiration Year: %d\n", (product + *n)->date[2]);
strcpy((product + *n)->productCode, reverse((product + *n)->productName));
printf("Product Code: %5s\n", (product + *n)->productCode);
}
void output(P *product, int n)
{
int i;
for(i = 0; i <= n; i++)
{
printf("Product name: %10s ", (product + i)->productName);
printf("Price: %5d ", (product + i)->price);
printf("Stock:%5d\n", (product + i)->stock);
}
}
int main()
{
int option;
int n;
P product[100];
n = -1;
do
{
printf("\n0.Iesire\n");
printf("1.Citirea unui produs de la tastatura\n");
printf("2.Afisarea produselor citite\n");
printf("3.Afisarea produselor cu un pret mai mic dat de utilizator\n");
printf("4.Sa se afiseze toate produsele care au lungimea numelui egala cu un numar par\n");
printf("5.Afisarea primului produs care este egal cu un nume dat de utilizator\n");
printf("6.Sa se realizeze produsul cifrelor fiecarui numar de bucati al produselor, apoi sa se copieze fiecare produs intr-un vector si sa se afiseze vectorul.\n");
printf("7.Copierea tuturor codurilor produselor intr-un vector de sir de caractere, apoi afisare vectorului\n");
printf("8.Copierea pretului produselor intr-un vector apoi afisarea vectorului in ordine crescatoare\n");
printf("9.Sa se transforme prima litera din codul produsului in litera mare daca aceasta este vocala.Nu se vor folosii functii predefinite in schimbarea literei\n");
printf("10.Sa se afiseze forma binara a numarului de bucati ale produselor care au numarul de bucati mai mic decat 100 .\n");
printf("11.Sa se afiseze toate produsele care urmeaza sa expire in urmatoarele 10 zile.Utilizator va preciza de la tastatura ziua si luna curenta.\n");
printf("12.Sa se pun pe ultimul rand al unei matrici de caractere de ordin dat de numarul de produse, primul caracter din fieacre nume de produs,pe restul '.'\n");
printf("13.Stabilirea unui nou pret pt toate produsele daca utilizatorul doreste.Astfel utilizator va stabili procentajul cu care se vor scumpi produsele.\n");
printf("14.Sa se stearga un produs precizat de utilizator prin numele acestuia\n");
printf("Introduceti o optiune: ");
scanf("%d", &optiune);
switch (option)
{
case 1:
input(product, &n);
break;
case 2:
output(product, n);
break;
case 3:
break;
case 4:
/* code */
break;
case 5:
/* code */
break;
case 6:
/* code */
break;
case 7:
/* code */
break;
case 8:
/* code */
break;
case 9:
/* code */
break;
case 10:
/* code */
break;
case 11:
/* code */
break;
case 12:
/* code */
break;
case 13:
/* code */
break;
case 14:
/* code */
break;
case 0:
exit(1);
break;
default:
printf("Introduceti o optiune valida");
break;
}
} while (option != 0);
return 0;
}发布于 2022-08-19 10:26:51
你不应该浪费时间输入15个‘提示’和15个大小写标签,就好像添加更多的代码会让事情顺利进行一样。我强烈建议删除该代码(或注释掉这些行),并将注意力集中在需要构建的小实用程序上。
这里有一个“固定”版本的reverse(),让您开始工作。请增量地工作,测试添加的每一行额外代码,以及您所做的每一个微小的更改。山不会自上而下生长..。
char *reverse( char *str ) {
for( int i = 0, j = strlen( str ) - 1; i <= j; i++, j-- ) {
char tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
return str;
}
int main() {
char *str[] = { "the fish", "goats are good" };
printf( "%s", str[0] );
printf( " == %s\n", reverse( str[0] ) );
printf( "%s", str[1] );
printf( " == %s\n", reverse( str[1] ) );
return 0;
}输出:
the fish == hsif eht
goats are good == doog era staog编辑:
由于对这个答案的批评,我觉得有责任补充一下这一点。
由于此函数反转字符串“就位”,因此需要修改以下代码行:
strcpy( (product + *n)->productCode, reverse((product + *n)->productName) );至
reverse( strcpy( (product + *n)->productCode, (product + *n)->productName) );发布于 2022-08-19 22:44:33
我正在发布这个公认的原始代码的“代码转储”修订版(附带一些注释),以演示“大图”草图如何与增量开发共存。请从main()的入口点到exit() of case 0:来学习这个例子。注意更短的名称是如何“澄清”函数中的代码的。当您想要“复制/粘贴/调整”某些代码行时,请问问自己,是否可以通过分离一个单独的函数来更好地服务这些功能。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Product {
char name[30]; // meaningful but shorter name
char code[30]; // meaningful but shorter name
int price;
int stock;
int exp_yr, exp_mo, exp_dy; // no confusion
} P_t; // conventional to use "_t" with tokens 'typedef'd
// primative 'helper' functions
char *getString( char *prompt, char *to, int len ) {
printf( "%s", prompt );
fgets( to, len, stdin );
to[ strlen(to) - 1 ] = '\0'; // get rid of '\n'
return to;
}
int getInt( char *prompt ) {
char buf[32];
return atoi( getString( prompt, buf, sizeof buf ) );
}
char *reverse( char *str ) { // "in place" string reversal
int lft = 0;
int rgt = strlen( str ) - 1;
for( ; lft <= rgt; lft++, rgt-- ) {
char tmp = str[ lft ];
str[ lft ] = str[ rgt ];
str[ rgt ] = tmp;
}
return str;
}
int nameValid( char *str ) { // check for bad chars
if( *str == '\0' ) return 0; // At least one char required
char *permitted = "- abcdefghijklmnopqrstuvwxyz"; // extra acceptable chars
return strspn( str, permitted ) == strlen( str ); // true if all chars okay
}
void input( P_t *pp ) { // fill-in ONE record
do {
getString( "Product name: ", pp->name, sizeof pp->name );
} while( !nameValid( pp->name ) );
reverse( strcpy( pp->code, pp->name ) );
printf( "Product Code: %s\n", pp->code );
pp->price = getInt( "Price: " );
pp->stock = getInt( "In stock: " );
// Not good, but sufficient
while( ( pp->exp_dy = getInt( "Exp. day: " ) ) < 1 || pp->exp_dy > 31 ) {} // loop
while( ( pp->exp_mo = getInt( "Exp. month: " ) ) < 1 || pp->exp_mo > 12 ) {} // loop
pp->exp_yr = getInt( "Exp. year: " );
}
// Renamed to show outputs multiple records
// Equivalent, but easier to think of as array
void outputAll( P_t prod[], int n ) {
for( int i = 0; i < n; i++ ) { // NB: changed '<=' to '<'
P_t *pp = &prod[ i ]; // less verbose
printf( "Product name: %10s ", pp->name );
printf( "Price: %5d ", pp->price );
printf( "Stock:%5d", pp->stock );
printf( "\n" ); // Clearly 'end of line'
}
}
int main() {
P_t product[100]; // uninitialised
int count = 0;
memset( product, 0, sizeof product ); // Now initialised
for( ;; ) {
printf(
"\n0.Iesire\n" );
printf(
"1.Citirea unui produs de la tastatura\n" );
printf(
"2.Afisarea produselor citite\n" );
/* printf(
"3.Afisarea produselor cu un pret mai mic dat de utilizator\n" );
printf(
"4.Sa se afiseze toate produsele care au lungimea numelui egala cu un numar par\n" );
printf(
"5.Afisarea primului produs care este egal cu un nume dat de utilizator\n" );
printf(
"6.Sa se realizeze produsul cifrelor fiecarui numar de bucati al produselor, "
"apoi sa se copieze fiecare produs intr-un vector si sa se afiseze vectorul.\n" );
printf(
"7.Copierea tuturor codurilor produselor intr-un vector de sir de caractere, "
"apoi afisare vectorului\n" );
printf(
"8.Copierea pretului produselor intr-un vector "
"apoi afisarea vectorului in ordine crescatoare\n" );
printf(
"9.Sa se transforme prima litera din codul "
"produsului in litera mare daca aceasta este vocala. "
"Nu se vor folosii functii predefinite in schimbarea literei\n" );
printf(
"10.Sa se afiseze forma binara a numarului de bucati "
"ale produselor care au numarul de bucati mai mic decat 100 .\n" );
printf(
"11.Sa se afiseze toate produsele care urmeaza sa expire in urmatoarele 10 zile. "
"Utilizator va preciza de la tastatura ziua si luna curenta.\n" );
printf(
"12.Sa se pun pe ultimul rand al unei matrici de caractere de ordin "
"dat de numarul de produse, primul caracter "
"din fieacre nume de produs,pe restul '.'\n" );
printf(
"13.Stabilirea unui nou pret pt toate produsele daca utilizatorul "
"doreste.Astfel utilizator va stabili procentajul cu "
"care se vor scumpi produsele.\n" );
printf(
"14.Sa se stearga un produs precizat de utilizator prin numele acestuia\n" );
*/
switch ( getInt( "Introduceti o optiune: " ) ) {
case 0:
exit( 1 ); // Would 'return 0' be better?
break;
case 1:
// increment it here, instead of using pointer there.
// pass only one element to be filled in.
input( &product[ count++ ] );
break;
case 2:
outputAll( product, count );
break;
// ToDo:
// case 3: break;
// case 4: break;
// case 5: break;
// case 6: break;
// case 7: break;
// case 8: break;
// case 9: break;
// case 10: break;
// case 11: break;
// case 12: break;
// case 13: break;
// case 14: break;
// End ToDo
default:
printf("Introduceti o optiune valida");
break;
}
}
return 0;
}https://stackoverflow.com/questions/73415146
复制相似问题