首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的函数不起作用,我也不明白为什么..in C

我的函数不起作用,我也不明白为什么..in C
EN

Stack Overflow用户
提问于 2022-08-19 10:10:08
回答 2查看 90关注 0票数 -2

我正在处理一个问题,保存商店库存的证据,这里有一个部分,它被要求得到产品的代码,我必须通过倒换产品的名称来得到。

例如:

代码语言:javascript
复制
name of the product : snack
codebar: kcans

而且每件事情都很好,直到它到达了与strcpy的线。

菜单不是英文的,但是第一个菜单得到输入,第二个菜单显示输出。

代码语言:javascript
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-19 10:26:51

你不应该浪费时间输入15个‘提示’和15个大小写标签,就好像添加更多的代码会让事情顺利进行一样。我强烈建议删除该代码(或注释掉这些行),并将注意力集中在需要构建的小实用程序上。

这里有一个“固定”版本的reverse(),让您开始工作。请增量地工作,测试添加的每一行额外代码,以及您所做的每一个微小的更改。山不会自上而下生长..。

代码语言:javascript
复制
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;
}

输出:

代码语言:javascript
复制
the fish == hsif eht
goats are good == doog era staog

编辑:

由于对这个答案的批评,我觉得有责任补充一下这一点。

由于此函数反转字符串“就位”,因此需要修改以下代码行:

代码语言:javascript
复制
strcpy( (product + *n)->productCode, reverse((product + *n)->productName) );

代码语言:javascript
复制
reverse( strcpy( (product + *n)->productCode, (product + *n)->productName) );
票数 0
EN

Stack Overflow用户

发布于 2022-08-19 22:44:33

我正在发布这个公认的原始代码的“代码转储”修订版(附带一些注释),以演示“大图”草图如何与增量开发共存。请从main()的入口点到exit() of case 0:来学习这个例子。注意更短的名称是如何“澄清”函数中的代码的。当您想要“复制/粘贴/调整”某些代码行时,请问问自己,是否可以通过分离一个单独的函数来更好地服务这些功能。

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73415146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档