由于str中的strcmp和strcpy导致的程序错误

时间:2013-10-08 18:49:08

标签: c for-loop menu strcmp strcpy

无论我如何编辑程序,似乎都存在溢出错误和不匹配的类型错误。有人可以帮我做这个没有错误的运行。

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

int main() {
    int choice;
    int i;
    int j;
    char type;
    int amount;
    int don_count = 0;
    int req_count = 0;
    int flag;
    char donations_inv_type[100][20];
    int donations_amount[100];
    char requests_inv_type[100][20];
    int req_amount[100];

    printf("Welcome to the Food Bank Program\n\n  1.  Add a donation\n  2.  Add a request\n  3.  Fulfill a request\n  4.  Print status report\n  5.  Exit\n\nEnter your choice: ");
    scanf("%d", &choice);

    while (choice != 5) {
        if (choice == 1) {
            printf("\nEnter inventory type: ");
            scanf("%s", &type);
            printf("Enter the amount: ");
            scanf("%d", &amount);
            printf("\nDonation Added!\n\n");
            flag = -99;
            for (i = 0; i < don_count; i++) {
                if (strcmp(donations_inv_type[i], type) == 0)
                    flag = i;
            }
                if (flag == -99) {
                    strcpy(donations_inv_type[i], type);
                    donations_amount[i] = amount;
                    don_count++;
                }
                else
                    donations_amount[flag] += amount;
        printf("Donation Added!\n");
        printf("Press any key to continue . . .\n\n");
        }
        else if (choice == 2) {
            printf("\nEnter inventory type: ");
            scanf("%s", &type);
            printf("Enter the amount: ");
            scanf("%d", &amount);
            strcpy(requests_inv_type[req_count], type);
            req_amount[req_count] = amount;
            req_count++;
        }
        else if (choice == 3) {
            printf("\n\n-------- Fulfilling Requests--------");
            flag = -99;
            for (i = 0; i < don_count; i++) {
                if (strcmp(donations_inv_type[i], requests_inv_type[0]) == 0)
                    flag = i;
            }
            if (flag == -99)
                printf("Cannot be Fulfilled\n\n");
            else if (donations_amount[flag] > req_amount[0]) {
                donations_amount[flag] -= req_amount[0];
                printf("Request Fulfilled");
                req_amount[0] = 0;
            }
            else if (donations_amount[flag] == req_amount[0]) {
                printf("Request Fulfilled");
                for (i = flag; i < don_count; i++) {
                    strcpy(donations_inv_type[i], donations_inv_type[i + 1]);
                    strcpy(donations_amount[i], donations_amount[i + 1]);
                }
                don_count--;
                for (i = flag; i < req_count; i++) {
                    strcpy(requests_inv_type[i], requests_inv_type[i + 1]);
                    strcpy(req_amount[i], req_amount[i + 1]);
                }
                req_count--;
            }
            else if (donations_amount[flag] < req_amount[0]) {
                printf("Partially Fulfilled");
                req_amount[0] -= donations_amount[flag];
                for (i = flag; i < don_count; i++) {
                    strcpy(donations_inv_type[i], donations_inv_type[i + 1]);
                    strcpy(donations_amount[i], donations_amount[i + 1]);
                don_count--;
            }
            }
        }
        else if (choice == 4) {
            printf("Printing the Donations Table\n\n");
            for (i = 0; i < don_count; i++) {
                printf("%s  %d", donations_inv_type[i], donations_amount[i]);
            }
            printf("Printing the Requests Table\n\n");
            for (i = 0; i < req_count; i++) {
                printf("%s  %d", requests_inv_type[i], req_amount[i]);
            }
        }
        printf("Welcome to the Food Bank Program\n\n  1.  Add a donation\n  2.  Add a request\n  3.  Fulfill a request\n  4.  Print status report\n  5.  Exit\n\nEnter your choice: ");
    }
}

非常感谢任何帮助,我希望能解释一下我做错了什么,以便我可以学习并且下次不会犯同样的错误。

2 个答案:

答案 0 :(得分:2)

而不是char type您需要char type[100]

代码出错:

if (strcmp(donations_inv_type[i], type) == 0)
 //                               ^^^^ should be char*

注意:函数strcmp()strcpy()应该传递\0以空字符结尾的char数组(或者说字符串)。

您的scanf应该看起来像scanf("%s", type);

答案 1 :(得分:2)

type声明为character array

char type[50];

删除&中的scanf()。阅读字符串时不应使用&

   scanf("%s", &type); ==>   scanf("%s", type);
               ^  

在这里你要复制整数而不是字符串

  strcpy(donations_amount[i], donations_amount[i + 1]);  
  strcpy(req_amount[i], req_amount[i + 1]);   

像这样修改

 donations_amount[i]=donations_amount[i + 1];
 req_amount[i]= req_amount[i + 1];