簡體   English   中英

讀取用戶輸入“ string”和“ int”,以空格分隔(C)

[英]Read user input “string” and “int” in one line separated by space (C)

我對單個鏈接列表具有某些功能,例如推,彈出,刪除等,並實現了以下功能來獲取用戶輸入:

void user_input(){
char input[10];
while(fgets(input, 9, stdin)){
    if(strncmp(input, "add", 3) == 0){
        int x;
        printf("Number to add: ");
        scanf("%d", &x);
        push(x);
        printf("%d added.\n", x);
    }
    else if(strncmp(input, "del", 3) == 0){
        int x;
        printf("Number to delete: ");
        scanf("%d", &x);
        delete(x);
        printf("%d deleted.\n", x);
    }
    else if(strncmp(input, "q", 1) == 0){
        printf("Program terminated.\n");
        break;
    }
    // and some other if else statements...
}

因此,我可以輸入“ add”之類的字符串,然后strncmp將其進行比較,然后出現另一個提示,要求我輸入要添加的數字並使用scanf存儲在x中。 像這樣:

add
Number to add: 5
5 added.

但是我正在尋找一種能夠輸入如下內容的方法:

add 5
del 2
etc.

基本上,一個字符串和一個int值在一行中用空格隔開,而不是先寫“ add”,然后按Enter鍵並寫上數字。 我嘗試使用sscanf,但還沒有運氣。

你可以像這樣使用scanf()

char str[10];
int c;
if( scanf("%9s %d", str, &c)!=2 )
{
    perror("Something went wrong.");
}

%s的寬度比str的大小小一。 多余的字符用於\\0

scanf()返回成功進行分配的次數,在這種情況下應為2

現在,如果您輸入類似

del 2

str將具有"del"c將具有2

如果先使用fgets然后使用sscanf ,則可以更輕松地fgets輸入錯誤。 您只需讀取另一個輸入字符串,而不會在輸入無效數據時四處尋找障礙。

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

void push(int x) {
}

void delete(int x) {
}

void triple(int x, int y, int z) {
}

int main(void) 
{
    char input[100];
    char oper[20];
    int x, y, z;        // romantic expansion for more than one argument
    int res;
    int err;

    while(1) {
        err = 0;
        if(fgets(input, sizeof input, stdin) != NULL) {
            res = sscanf(input, "%19s%d%d%d", oper, &x, &y, &z);

            if(res == 2 && strcmp(oper, "add") == 0){
                push(x);
                printf("%d added.\n", x);
            }
            else if(res == 2 && strcmp(oper, "del") == 0) {
                delete(x);
                printf("%d deleted.\n", x);
            }
            else if(res == 4 && strcmp(oper, "trip") == 0) {  // fantasy
                    triple(x, y, z);
                printf("%d %d %d tripled.\n", x, y, z);
            }
            else if(res == 1 && strcmp(oper, "q") == 0){
                printf("Program terminated.\n");
                break;
            }
            // some other if else statements...

            else {
                err = 1;
            }
        }

        else {
            err = 1;
        }

        if(err) {
            printf("Bad operation.\n");
        }
    }
    return 0;
}

嘗試做的一個好的策略是:

  1. 逐行讀取輸入。
  2. 處理每一行。
  3. 繼續直到沒有輸入或用戶選擇退出為止。

這是核心輪廓。

// Make LINE_SIZE big enough for your needs
#define LINE_SIZE 100

void processLine(char line[]);    

int main()
{
   char line[LINE_SIZE];
   while ( fgets(line, LINE_SIZE, stdin) != NULL )
   {
      processLine(line);
   }
}


void processLine(char line[])
{
}

processLine ,您的第一項工作是拉命令。 根據命令執行需要的操作。

void processLine(char line[])
{
    char command[20];
    int num = 0;

    // Read the command and gather the number of characters read
    // This allows you to read more data from (line + num)
    int n = sscanf(line, "%19s%n", command, &num);
    if ( n != 2 )
    {
       // Problem
       exit(0);
    }

    // The command is to quit, exit.
    if ( isQuitCommand(command) )
    {
       exit(0);
    }

    char* commandData = line + num;
    if ( isAddCommand(command) )
    {
       processAdd(commandData);
    }
    else if ( isDeleteCommand(command) )
    {
       processDelete(commandData);
    }
    else { ... }
}

這是程序的一個版本,帶有用於幾個功能的存根。

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

// Make LINE_SIZE big enough for your needs
#define LINE_SIZE 100

void processLine(char line[]);    

int isQuitCommand(char command[]);

int isAddCommand(char command[]);

int isDeleteCommand(char command[]);

void processAdd(char commandData[]);

void processDelete(char commandData[]);


int main()
{
   char line[LINE_SIZE];
   while ( fgets(line, LINE_SIZE, stdin) != NULL )
   {
      processLine(line);
   }
}


void processLine(char line[])
{
   char command[20];
   int num = 0;

   // Read the command and gather the number of characters read
   // This allows you to read more data from (line + num)
   int n = sscanf(line, "%19s%n", command, &num);
   if ( n != 2 )
   {
      // Problem
      exit(0);
   }

   // The command is to quit, exit.
   if ( isQuitCommand(command) )
   {
      exit(0);
   }

   char* commandData = line + num;
   if ( isAddCommand(command) )
   {
      processAdd(commandData);
   }
   else if ( isDeleteCommand(command) )
   {
      processDelete(commandData);
   }
   else
   {
      // ...
   }
}

int isQuitCommand(char command[])
{
   return (command[0] == 'q');
}

int isAddCommand(char command[])
{
   return (strcmp(command, "add") == 0);
}

int isDeleteCommand(char command[])
{
   return (strcmp(command, "del") == 0);
}

void processAdd(char commandData[])
{
   // Add code to process commandData
}

void processDelete(char commandData[])
{
   // Add code to process commandData
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM