区分switch()函数中的整数和特殊字符

时间:2017-01-05 21:39:57

标签: c

我遇到了一个程序问题,该程序应该从标准输入读取一个数字或一个特殊字符,并根据它读取的内容运行一个特定的函数。如果输入是一个数字,它应该放在一个堆栈上,如果它是一个特殊的字符,它应该触发一个数学函数。但是,我无法确定应该使用哪种输入功能或技巧。我创建了一个switch()函数

 import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import java.net.*;


public class Write2DBWS {

     private static String cid;
     private static String cover;
     private static String corrections;
     private static String url;

    public static void main(String [] args) {

        //bucketName     = "claims";
        // keyName        = "cid995/4269-1474672347-allclosingdocuments_ErrorReport.pdf";
        // uploadFileName = "c:/pdf/Pages from 4269-1474672347-allclosingdocuments_ErrorReport.pdf";

        if (args.length == 0) {
            cid = "995";
            cover = "";
            corrections = "cid995/8422-1482271174-estimatingsoftwarearchive_ErrorReport.pdf";
            } else { 

                cid = args[0];
                cover = args[1];
                corrections = args[2];
            }


        Write2DBWS w = new Write2DBWS();

        w.getPlainTextResponse();

    }

         private void getPlainTextResponse() {
         try {

             url = "https://xxxxxxx.com/REST/corrections_acd.php?cid=" + cid + "&handshake=TyServiceToExtractData34985&corrections_src=" + corrections;

             System.out.println(url);        

             Client client = Client.create();

             WebResource webResource = client.resource(url);
             ClientResponse response = webResource.accept(" ").get(ClientResponse.class);

             if (response.getStatus() != 200) {
                 throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
             }  

             System.out.println("Response => " + response.getStatus());

             //String output2 = response.getEntity(String.class);
             //System.out.println("\n============Plain Text Response============");
             //System.out.println(output2);

                } catch (Exception e) {
                    e.printStackTrace();
                }
         }//end of method

    }

然而,如果我使用scanf来读取一个字符,我将它放在堆栈上就会出现问题(atoi()需要一个指针),如果我扫描整数,它就不能与字符进行比较。有没有其他方法可以使这项工作?我尝试了多个scanf,但后来我仍然遇到区分数字和特殊字符的问题,最后将字符放在堆栈上。

4 个答案:

答案 0 :(得分:1)

%c scanf格式说明符一次读取一个字符。所以你不能用它来读取多个数字的数字,至少不能跟踪你读到的最后一个字符并把它推到最后读取的数字上。

假设您的每个令牌必须用空格分隔,您最好使用%s格式说明符来读取字符串。然后你会检查字符串的第一个字符,看看它是什么类型的标记。

您可以利用堕落案例来检查您是否有数字。

char token[20] = "";
scanf("%s", token);
switch (token[0]) {
  case'+':
    add(stack); 
    break; 
  case '-':
    sub(stack); 
    break;
  case '0':
  case '1':
  case '2':
  case '3':
  case '4':
  case '5':
  case '6':
  case '7':
  case '8':
  case '9':
    push(stack, atoi(token)); 
    break;
  ...

答案 1 :(得分:0)

你好,你的计算器可以处理单位数字吗?不过你的问题。在这种情况下,使用isdigit测试数字的字符并推送到堆栈。否则请使用大开关。

char a;
sscanf ("%c", a);
if (isdigit (a)) {
    int num = atoi (&a);
    push (stack, num);
}
else
    switch (a) {
    ....
    }

编辑:除了读取输入外,检测多位数也很容易。如果你的目标是GNU系统,你可以使用“%ms”标志,它将分配所需的内存。

bool isdigita (const char* s)
{
    char c = *s;
    while (c != '\0') {
        if (!isdigit (c))
            return false;
        c = *s++;
    }
    return true;
}

void test_isdigita ()
{
    assert (isdigita ("42"));
    assert (!isdigita (" 42"));
    assert (!isdigita ("42!!"));
    assert (!isdigita ("4!!1"));
}

答案 2 :(得分:0)

您可以使用case fall-through 功能。

scanf("%c", &a);
 switch(a) { 
  case'+':
   add(stack); 
   break; 
  case '-':
   sub(stack); 
   break;
  case '0':
  case '1':
  case '2':
  case '3':
  case '4':
  case '5':
  case '6':
  case '7':
  case '8':
  case '9':
   push(stack, a); 
   break;
    ...}

答案 3 :(得分:0)

您可以阅读第一个字符 - 可能跳过前导空格 - 并根据该字符做出决定。如果是数字,请继续阅读其余数字;否则将其与可接受的特殊字符匹配。例如:

int ch;

// ...

ch = getch();
switch (ch) {
    case -1:
        // handle error / EOF ...
        break;
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
        // read the rest of the digits of the number, if any ...
        // push the assembled number ...
        break;
    case '+':
        // ...
        break;
    // ... more cases ...
    case ' ':
        // do nothing
        break;
    default:
        // handle invalid input ...
        break;
}

还有其他选择。