首页 > 解决方案 > 通过字符串输入和 void 函数创建购物清单 - 输入字符串不显示

问题描述

我对 C (高中生)相当陌生,我的目标是通过输入一组字符来制作购物清单。然后,输出将打印出我当前添加到列表中的内容。这将永远持续下去,直到我退出程序或进入主菜单。

屏幕1

 00 - GO TO GREETINGS SCREEN
 01 - ADD MORE ITEMS TO THE LIST

 CODE ENTRY: ___

屏幕2

然后我输入01添加项目:

 Input "DONE" to end program and see final list.

 LIST ENTRY: ______________

屏幕3

然后我添加“苹果”,然后它带我到这个屏幕:

 GROCERY LIST:
 POTATOES
 FISH
 APPLES

之后,它带我回到 SCREEN1,在那里我会选择是去问候屏幕还是添加更多。

我当前的代码:

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

int main()
{
    int n;
    char * grocery;
    mainMenu:
    system("cls");
    n = 0;
    printf("00 - Go to greetings screen\n01 - Add groceries to list\nENTRY: ");scanf("%d",&n);
    if(n == 0)
    {
        greetings();
        goto mainMenu;
    }
    else if(n == 1)
    {
        printf("GROCERY ENTRY: ");scanf("%s",grocery);
        add(grocery);
        goto mainMenu;
    }
    else
    {
        printf("Wrong value added. Try again.");
        sleep(2);
        goto mainMenu;
    }
}

void greetings()
{
    system("cls");
    printf("hello! press any key to go back to menu");
    getch();
    system("cls");
}

void add(char * a)
{
    system("cls");
    char listData[1000] = "",slashN[4] = "\n";
    strcat(listData,a);
    strcat(listData,slashN);
    printf("THINGS TO BUY:\n");
    puts(listData);
}

笔记

我使用 strcat 以便它记住原始字符串的值。这将确保新输入将放在旧数据之上,对吗?(希望我的逻辑在那个方面是正确的

但是,即使我切换到其他菜单,例如问候菜单(它是计算器之类的占位符),我也无法确定程序是否仍会记住字符串数据。

现在,除了杂货清单一项之外,初始功能都可以使用。每当我输入一个字符串时,它什么都没有,甚至是printf("THINGS TO BUY:")部分,这让我认为这是我输入的东西void add(char * a)

标签: c

解决方案


试用您的代码后,我收到了一个分段错误,您有scanf("%s",grocery);. 尝试使用 malloc(3) 为变量分配空间(参见http://man7.org/linux/man-pages/man3/malloc.3.html)。例如,char *grocery = (char *)malloc(sizeof(char) * 100);将给您 100 个字符以从输入中读入您的杂货变量。

同样的目标也可以通过简单地使用char grocery[100];其他变量来实现。

此外,正如许多程序员所建议的那样,尽量不要使用goto(). 这可能会导致意大利面条代码(请参阅https://en.wikipedia.org/wiki/Spaghetti_code)。相反,使用仅当用户输入一些旨在停止输入请求的操作时才停止的 while 循环。

最后,为了避免不必要的结果,\n实际上是单个字符。因此,char slashN[4] = "\n"可以char slashN = '\n';

快乐编码!:D


推荐阅读