我目前正在编写一个简单的代码来将两个数字相乘,但是我想添加一个选项,使程序在初始提示“按x离开”时就离开程序。这是我到目前为止的内容:
printf(" Please input two numbers between 0 and 4000 or press x to leave: \n\n");
scanf(" %d %d", &var1, &var2);
if ((var1 > 4000) || (var2 > 4000) || (var1 < 0) || (var2 < 0)) {
while (1) {
printf(
"\n Input out of range, please use only values between 0 and 4000 \n\n");
return main();
}
while (0) {
return (0);
}
}
printf("\n Your inputs are %d and %d. \n\n", var1, var2);
printf(" %d multiplied by %d is equal to %d \n", var1, var2, var1*var2);
我对C还是很陌生,我只是想弄清楚是否有一种方法可以在scanf()
中进行澄清,如果它的输入是两个十进制值,则继续输入,但是如果它是单数{ char
的{1}}输入,然后立即离开。
有可能吗?
如果不能,那么您能否提供有关我可以研究的新方向的提示?就像另一个x
语句一样,以验证进入if()
的内容是什么?
我还假设用户将只输入两个数字或字母x。到目前为止,我只写了一个简单的if语句来澄清。感谢您提供的任何信息。
答案 0 :(得分:3)
%d
的{{1}}格式说明符期望读取整数值。如果遇到非整数的内容,它将停止读取并将不匹配的字符保留在缓冲区中。
此外,scanf
不应递归调用。
处理此问题的最佳方法是先用main
读一行文本,然后检查其是否为“ x”。如果是这样,请打破阅读循环。如果不是,请使用fgets
读取两个整数,并检查以确保返回值是2,这意味着已读取2个值。
sscanf
答案 1 :(得分:0)
不可能以这种方式使用scanf。您可以执行的最接近的操作类似于以下代码。希望这会有所帮助!
int var1, var2;
char ch;
while (1)
{
printf("Please input two numbers between 0 and 4000\n\n");
scanf(" %d %d", &var1, &var2);
if ((var1 > 4000) || (var2 > 4000) || (var1 < 0) || (var2 < 0))
printf("\n Input out of range, please use only values between 0 and 4000 \n\n");
else
{
printf("\n Your inputs are %d and %d.\n", var1, var2);
printf(" %d multiplied by %d is equal to %d \n", var1, var2, var1*var2);
printf("Press x to leave or any other key to continue...\n\n");
scanf(" %c", &ch);
if (ch == 'x') break;
}
}
答案 2 :(得分:0)
这是可能的,但有很多限制。 @dbush提供的代码实际上是这里更优雅的选择,而Gautam提供的代码则更简单,但是并没有您需要的方式完成。
尽管可以通过以下代码以更简单的方式实现所需的功能:
在进入代码之前,先做一个简短的解释:
strcspn
,则搜索字符串。可以使用int
方法来完成。如果是,请退出,否则继续。现在将字符串中的2个数字转换为atoi
。为此,请使用int
方法。在原始字符串上使用它可以使您获得第一个数字space
(即直到遇到第一个int
为止)。通过提取字符串的第二部分,即空格之后,将其转换为#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main() {
int var1, var2, index, length, isInvalid = 0;
char s[10], s2[10];
//do {
isInvalid = 0;
printf(" Please input two numbers between 0 and 4000 or press x to leave: \n\n");
scanf("%[^\n]s", s); //accept the 2 numbers or the 'x' as a string
length = strlen(s); //calculate the length of the string
index = strcspn(s, "x"); //check if user has entered 'x'
//if 'x' is present its position will be stored in 'index', if not present value of index will be length of string.
if (index < length) { //if 'x' is present
isInvalid = 0;
printf("\nAborted");
return 0;
} else { //if 'x' isn't entered
var1 = atoi(s); //converts the first part of string(before space) to its int equivalent
index = strcspn(s, " "); //get the postion of space
strncpy(s2, s + index, length); //get the part of string after space
var2 = atoi(s2); //convert the second part of string into int
//rest is your usual code.. without your return main() part which isn't really right
if ((var1 > 4000) || (var2 > 4000) || (var1 < 0) || (var2 < 0)) {
printf("\n Input out of range, please use only values between 0 and 4000 \n\n");
isInvalid = 1;
}
printf("\n Your inputs are %d and %d. \n\n", var1, var2);
printf(" %d multiplied by %d is equal to %d \n", var1, var2, var1 * var2);
}
//} while (isInvalid);
return 0;
}
以获得第二个数字。
LPCTSTR cnName= fqdn;
DWORD cbEncoded = 0;
if (!CertStrToName(X509_ASN_ENCODING, cnName, CERT_X500_NAME_STR, NULL,
pbdata, &cbData, NULL))
{
_tprintf(_T("CertStrToName failed 0x%x\n"), GetLastError());
return 0;
}
if (!(pbdata = (BYTE *)malloc(cbData)))
{
_tprintf(_T("malloc Error 0x%x\n"), GetLastError());
return 0;
}
if (!CertStrToName(X509_ASN_ENCODING, cnName, CERT_X500_NAME_STR, NULL, pbdata, &cbData, NULL))
{
_tprintf(_T("CertStrToName failed 0x%x\n"), GetLastError());
return 0;
}
CERT_NAME_BLOB IssuerBlob;
IssuerBlob.cbData = cbEncoded;
IssuerBlob.pbData = pbEncoded;
CertCreateSelfSignCertificate(NULL, &IssuerBlob, 0, &KeyProvInfo, &Alg, 0, &EndTime, 0);
OpenandAddCertificateToStore(pCertContext, L"MY");
OpenandAddCertificateToStore(pCertContext, L"Root");
但是请记住这里的一个非常重要的缺点:输入时必须输入两个数字,以空格分隔。两次单击“ enter”键不起作用。