【问题标题】:Scanning 2 chars in one line在一行中扫描 2 个字符
【发布时间】:2022-01-03 00:13:23
【问题描述】:

我是 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;
        }
    }
}

【问题讨论】:

  • 不要做while(1)。用while( scanf(" %c-%c", &amp;x, &amp;y) == 2 ){ ... 检查scanf 返回的值。注意格式字符串中的前导空格并理解它的作用。
  • scanf_s("%c-%c", &amp;x, 1, &amp;y, 1); 的等效项是 scanf("%c-%c", &amp;x, &amp;y);,但请注意在 this comment 中添加了一个空格。
  • 请注意,通过强迫您使用scanf,您的教练会强迫您做相当于学习如何骑方形辅助轮的自行车。现在事实上,一旦你学好 C,你就再也不会使用 scanf 了。对于非常简单的输入,它充其量是有用的。您在这里尝试做的事情并不是“非常简单”,而且或多或少完全是在浪费时间。所以,尽你所能安抚你的近视教练,但不要以为你正在学习任何有用的东西。
  • 如果 scanf() 不是必需的,请考虑使用 fgets(),然后生成字符串数组,例如 char buf[4];,数组元素 buf[0]buf[1]buf[2] 将包含例如“a”、“-”和“c”。 (buf[3] 将包含 nul 字符。)这些只是恰好在 ASCII 字符范围内的数值,但也可以作为数字进行逻辑操作,例如 if(buf[0] &gt; buf[2])(//do something)

标签: c scanf


【解决方案1】:

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

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转换说明符

【讨论】:

    【解决方案2】:

    一行扫描2个字符

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

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

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

    现在将字符串扫描/解析为两个字符。寻找错误的输入。

      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()。它不会读取任何内容。

    【讨论】:

      【解决方案3】:

      "任务:输入 2 个字母并按输入中指定的顺序打印,例如 a-c --> ABC 或 c-a --> cba"

      如果不需要scanf(),请考虑使用fgets(),然后生成的字符串数组,比如char buf[4] = {0};,数组元素buf[0]buf[1]buf[2]将包含例如'a''-''c'。 (buf[3] 将包含 \0 字符。)这些只是恰好在 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");
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

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

        #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;
                }
                 
            }
        }
        

        【讨论】:

        • 你真的不想这样做。当以echo "a-z" | ./a.out 运行时,该程序如何响应? (答案:不好)。您真的非常想将循环构造为while( scanf(...) == 2 )
        猜你喜欢
        • 1970-01-01
        • 2014-01-26
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 2017-03-30
        • 2020-07-27
        相关资源
        最近更新 更多