一行扫描 2 个字符

Scanning 2 chars in one line

我是 C 的新手,我想在一行中扫描两个 char 变量。

我使用#define _CRT_SECURE_NO_WARNINGS 因为我必须这样做。 这是一段让我烦恼的代码:scanf_s("%c-%c", &x,1, &y,1);

当输入 2 个字符时,它看起来像这样 ---> e-f 或 a-b 另外,我需要输掉 scanf_s 并将其变成 scanf

另一件对我来说有点奇怪的事情是,在我输入两个字符并稍后执行操作后,我将 x 和 y 的值重置为 0 并需要再次输入它们。然而,当我输入它们时,我得到了完全不同的值。

这是我到目前为止编写的全部代码。任务:输入 2 个字母并按输入中指定的顺序打印它们,例如a-c --> ABC 或 c-a --> cba

#include<stdio.h>
#define MAX 100

int main(){

    char niz[MAX];

    char kraj[MAX] = {0};

    int razlika;//difference 

    char x, y;
    int i;
    char trenutniznak; //current character
    int stoppolje=0;//stop field
    int temp = 0;
    while (1)
    {
        scanf_s("%c-%c", &x,1, &y,1);
    

        if (x == '.' || y == '.')
        {
            return 0;
        }
        else if (y > x)//od pocetka do kraja 
        {              //(from start to end )
            razlika = y - x + 1;
            
            for (i = stoppolje+1, trenutniznak=x; i <= razlika; i++, trenutniznak++)
            {
                niz[i] = trenutniznak;
                temp = i;
            }
            stoppolje = temp; // polje na kojem je zadnji znak
                              //(the field where the last character is )
            x = 0;
            y = 0;
            razlika = 0;
        }
        else 
        {
            printf("\n");
            return 0;
        }
    }
}

尝试理解然后在代码中实现

char c;
scanf(" %c",&c); // a whitespace character in scanf() would ignore any number of whitespace characters left in the input stream
printf("%c",c);

您可以通过 %c 转换说明符

Scanning 2 chars in one line

简化。使用 fgets() 读取 的用户输入并将其转换为 string.

避免scanf()。它不能很好地读取 并且在输入意外时难以使用。

char buf[80];
if (fgets(buf, sizeof buf, stdin)) { 

现在scan/parse把字符串变成两个字符。寻找错误的输入。

  char extra;
  if (sscanf(buf, "%c-%c %c", &x, &y, &extra)  != 2) {
    fprintf(stderr, "invalid input <%s>\n", buf);
  } else {
    // Use x, y in some fashion
    printf("Good input <%c> <%c>\n", x, y);
  }
}
  

潜行:如果你必须使用scanf(),在fgets()之前添加一个scanf("");使用 scanf()。它不会读取任何内容。

"Task: input 2 letters and print them in order specified in input e.g. a-c --> ABC or c-a --> cba"

如果scanf()不是必需的,考虑使用fgets(),然后生成字符串数组,比如char buf[4] = {0};数组元素buf[0]buf[1] buf[2] 将包含例如 'a''-''c'。 (buf[3] 将包含 [=21=] 字符。)这些只是恰好在 ASCII 字符范围内的数值,但也可以作为数字进行逻辑操作,因此只需使用格式输出数字序列保证它们显示为 ASCII 的说明符:

int main(void)
{

    char buf[4] = {0};
    int c = 0;
    printf("Enter maximum of three characters: eg 'a-d'\n(or ctrl-c to exit.)\n");
    while(fgets(buf, sizeof buf, stdin))
    {
        //test input
        if((buf[0] < 'a') || (buf[0] > 'Z') || 
           (buf[2] < 'a') || (buf[2] > 'Z') || 
           (buf[1] != '-')
          )
        {
            printf("Invalid input.  Try again\n(or hit ctrl-c to exit.");
        }
        else
        {
            buf[strcspn(buf, "\n")] = 0;//remove newline
            if(buf[0] > buf[2])
            {
               for(char i = buf[0];i >= buf[2];i--)
               {
                   printf("%c", i);
               } 
               printf("\n");           
           }
           else if ((buf[0] < buf[2]))
           {
               for(char i = buf[0];i<= buf[2];i++)
               {
                   printf("%c", toupper(i));//note UPPER CASE as specified
               }
               printf("\n");
           }
           memset(buf, 0, sizeof buf);//reset buffer for next iteration.
           while((c = getchar()) != '\n' && c != EOF);//clear \n from stdin
           printf("\nEnter maximum of three characters: eg 'a-d'\n(or ctrl-c to exit.)\n");
        }
    }
}

嗯,我设法做到了,谢谢大家回答我的问题:)

#include<stdio.h>

#define MAX 1000

int main()
{
    char niz[MAX];
    char kraj[MAX] = {0};
    int razlika;
    char x, y;
    int i;
    char trenutniznak; 
    int stoppolje=-1;
    int temp = 0;
    while (1)
    {
        scanf_s(" %c-%c", &x,1, &y,1);
    
        
        if (x == '.' || y == '.')
        {
            for (i = 0; i <= stoppolje; i++)
            {
                printf("%c", niz[i]);
            }
            return 0;
        }
        else if(x == '_' || y == '_')
        {
            niz[stoppolje + 1] = ' ';
            stoppolje += 1;
        }
        else if (y > x)//od pocetka do kraja
        {
            razlika = y - x + 1;
            trenutniznak = x;
            for (i = stoppolje+1, trenutniznak; i < razlika+stoppolje+1; i++, trenutniznak++)
            {
                niz[i] = trenutniznak;
                temp = i;
            }
            stoppolje = temp; // polje na kojem je zadnji znak
            x = 0;
            y = 0;
            razlika = 0;
        }//ako idemo po redosljedu abecednom
        else if(x>y)
        {
            razlika = x-y + 1;
            trenutniznak = x;
            for (i = stoppolje+1, trenutniznak; i < razlika + stoppolje + 1; i++, trenutniznak--)
            {
                niz[i] = trenutniznak;
                temp = i;
            }
            stoppolje = temp;
            x = 0;
            y = 0;
            razlika = 0;
        }
        else if (x == y)
        {
            razlika = 0;
            trenutniznak = x;
            for (i = stoppolje + 1, trenutniznak; i < razlika + stoppolje + 2; i++, trenutniznak++)
            {
                niz[i] = trenutniznak;
                temp = i;
            }
            stoppolje = temp;
            x = 0;
            y = 0;
            razlika = 0;
        }
         
    }
}