c - 如何修复 C 语言中的 switch case 菜单错误?

标签 c menu switch-statement

首先让我向您展示代码...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>    
#include <errno.h> 
#include <sys/socket.h>    
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <unistd.h>    


void load_menu(void);
void flood(void);
void dos(void);
void scan(void);


int main(int argc, char** argv)
{

    // Ip values
    const char* google_dns_server = "192.168.1.1";
    int dns_port = 53;

    struct sockaddr_in serv;

    int sock = socket ( AF_INET, SOCK_DGRAM, 0);

    //Socket could not be created
    if(sock < 0)
    {
        perror("Socket error");
    }

    printf ("                                                      \n");
    printf ("                 __     __   ____  ____               \n");
    printf ("                (  )   (  ) (  , |(  , |              \n");
    printf ("                 )(__  )__(  ) _/  ) _/               \n");
    printf ("                (____)(_)(_)(_)   (_)                 \n");  
    printf ("                                                      \n");     
    printf ("                   Version [0.1.0]                    \n");
    printf ("            https://github.com/Abrupt/Lapp            \n");
    printf ("                                                      \n");
    printf ("                                  Written by @Abrrupt \n");

    memset( &serv, 0, sizeof(serv) );
    serv.sin_family = AF_INET;
    serv.sin_addr.s_addr = inet_addr( google_dns_server );
    serv.sin_port = htons( dns_port );

    int err = connect( sock , (const struct sockaddr*) &serv , sizeof(serv) );

    struct sockaddr_in name;
    socklen_t namelen = sizeof(name);
    err = getsockname(sock, (struct sockaddr*) &name, &namelen);

    char buffer[100];
    const char* p = inet_ntop(AF_INET, &name.sin_addr, buffer, 100);

    if(p != NULL) {
        printf("Local ip: %s \n" , buffer);
    }
    else{
        printf ("Error number: %d . Error message: %s \n" , errno , strerror(errno));
    }

    close(sock);

    load_menu();
    return 0;
}

void load_menu(void)
{
    int choice;
    int num;
    int ch;

    do
    {
    printf("+------------------------------------------------------------------+\n");
    printf("|            Commands           |          Description             |\n");
    printf("+------------------------------------------------------------------+\n");

    printf("+------------------------------------------------------------------+\n");      
    printf("|(1) SYN Flood Attack           | Create a new flood;              |\n");
    printf("|(2) DoS Attack                 | Start a DoS attack;              |\n");
    printf("|(3) Port Scan                  | Run TCP port scan                |\n");
    printf("|(4) Delete_All                 | Delete all exisitng history;     |\n");
    printf("+------------------------------------------------------------------+\n");
    scanf("%d",&choice);

        switch(choice)
        {
            case 1: flood();
                break;
            case 2: dos();
                break;
            case 3: scan();
                break;
            case 4: printf("Quitting program!\n");
                exit( 0 );
                break;
            default: printf("Invalid choice!\n");
                break;
        }

    } while (choice != 3); 

    printf("use > ");
    scanf("%d",&num);

    /* Flushes input buffer from the newline from scanf() */
    while ( (ch = getchar()) != '\n' && ch != EOF) ;

    printf("\n\nPress ENTER to continue.");
    while ( (ch = getchar()) != '\n' && ch != EOF);

    return;
}

好吧,我在输出时遇到了这个问题

"_dos", referenced from:
      _load_menu in menu-20c7bc.o
  "_flood", referenced from:
      _load_menu in menu-20c7bc.o
  "_scan", referenced from:
      _load_menu in menu-20c7bc.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我猜它与开关盒菜单有关。该菜单的全部目的是让用户与选项进行交互(显然)。

我想知道如何修复 switch case 菜单,以便您可以轻松键入数字选项,然后让代码输出您选择的任何选项。

例如:

如果我选择选项 1,它将向 IP 输出 SYN 洪水。

这就是开关盒菜单的全部要点。谢谢

最佳答案

您发布的错误是链接器错误,由函数 flood()dos()scan() 的声明引起> 没有任何定义。如果您需要测试菜单,我建议为每个执行类似 printf 语句的操作定义“占位符”函数(或者您所做的,即将 printf 语句放在 case 中) ,但无论如何您最终都会在稍后更改它)直到您启动并运行实际的功能。

关于c - 如何修复 C 语言中的 switch case 菜单错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30826461/

相关文章:

Android ActionBarShelock onOptionsItemSelected

C 使用案例(条件): instead of case value:

jQuery 3d 滑动切换过渡

c - Matlab/C/Java 或任何其他数字系统程序中的正弦函数

c++ - 在 C 代码中注册 C++ 回调方法

python - 下标值不是数组、指针或 vector ,当我尝试执行此内核代码时收到此错误消息

c# - .Net switch 语句是散列的还是索引的?

c - GCC 2.9 和 "lvalue required as left operand of assignment"

html - 粘性导航和移动响应

java - 如何向 Android 的 native 'Edit text' 上下文菜单添加选项