您能否将scanf的输入分为两种类型,分别执行两项操作?

时间:2019-02-28 04:50:08

标签: c scanf

我目前正在编写一个简单的代码来将两个数字相乘,但是我想添加一个选项,使程序在初始提示“按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语句来澄清。感谢您提供的任何信息。

3 个答案:

答案 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”键不起作用。