我遇到了一个程序问题,该程序应该从标准输入读取一个数字或一个特殊字符,并根据它读取的内容运行一个特定的函数。如果输入是一个数字,它应该放在一个堆栈上,如果它是一个特殊的字符,它应该触发一个数学函数。但是,我无法确定应该使用哪种输入功能或技巧。我创建了一个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,但后来我仍然遇到区分数字和特殊字符的问题,最后将字符放在堆栈上。
答案 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)
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;
}
还有其他选择。