【问题标题】:Set variables by using fgetc(stdin)使用 fgetc(stdin) 设置变量
【发布时间】:2015-08-18 08:32:54
【问题描述】:

我正在尝试使用来自stdin 的fgetc() 设置变量。

这是我目前的代码,

#include <stdio.h>

int main(void){
    int ch;
    int firstNumber,secondNumber;
    char str;

    printf("Enter two numbers and a string: ");
    while((ch=fgetc(stdin))!='\n'){
        while(ch != ' '){
            firstNumber = ch;
            secondNumber = ch;
            string = ch;
            }
        }
    printf("%d %d %s",firstNumber,secondNumber,string);
    return 0;
}

因此,如果我输入2 2 string(字符之间有空格)

我希望变量 firstNumber 为 2

而secondNumber 是2

而str 是string

【问题讨论】:

  • 您正在阅读 ASCII 字符。您必须将字符转换为数字。试试firstNumber = atoi(ch); 您一次读取一个字符,所以这不适用于多位数字。
  • scanf 更适合您的任务。
  • while(ch != ' ') 条件将进入无限循环,如果你给出一个非空格字符:(

标签: c stdin fgetc


【解决方案1】:

这是可能的方法:

  1. 您可以先解析整个字符串并将其存储到临时缓冲区中。
  2. 您现在可以使用strtok() 来标记使用' '(space) 字符的字符串。或者,您可以使用 sscanf() 代替 strtok()。
  3. 对前两个数字使用atoi(),然后读取最后一个字符串。

代码:

假设存储扫描字符串所需的缓冲区不超过100字节。

使用strtok():

int main()
{
    int ch,i=0;
    int firstNumber,secondNumber;
    const char seperator[2] = " -";
    char buffer[100];
    char *string;

    printf("Enter two numbers and a string: ");
    while((ch=fgetc(stdin))!='\n'){
        buff[i++]=ch;
    }

    /* get the first token as a number */
    firstNumber = atoi(strtok(buff, seperator));
    printf("%d\n",firstNumber);

    /* get the second token as a number*/   
    secondNumber = atoi(strtok(NULL, seperator));    
    printf("%d\n",secondNumber);

    /* get the third token as a string */
    string=strtok(NULL, seperator);
    printf("%s\n",string);

    return(0);
}

使用sscanf():

printf("Enter two numbers and a string: ");
while((ch=fgetc(stdin))!='\n'){
    buff[i++]=ch;
}

sscanf(buff, "%d %d %s", &firstNumber, &secondNumber, string);  
printf("%d\n%d\n%s\n", firstNumber, secondNumber, string);

【讨论】:

    【解决方案2】:

    我认为你的解决方案应该是:

    #include <stdio.h>
    
    int main(void){
        int ch;
        int firstNumber=0,secondNumber=0,b=0;
        char str;
    
        printf("Enter two numbers and a string: ");
        while((ch=fgetc(stdin))!='\n'){
            if (ch != ' '){
                if (b==0)
                     firstNumber = firstnumber*10 + ch-'0';
                else
                if (b==1)
                    secondNumber = secondnumber*10 + ch-'0';
                else
                    str = ch;
            }
            else b++;
        }
        printf("%d %d %c",firstNumber,secondNumber,str);
        return 0;
    }
    

    请注意,b 会跟踪您分配的内容,并且要打印 str,实际上只是一个字符,您需要使用 %c。此外,没有要打印的变量 string,只有 str。

    【讨论】:

    • atoi 接受一个以 nul 结尾的字符串,传递单个整数是 UB。
    • 如果数字多于一个数字,例如:22 234,该怎么办?在这种情况下 ch-'0' 失败
    • @TryinHard,OP 要求的是个位数。将其视为他/她学习基础知识的示范。
    • 嘿,OP提到了“两个数字”和“不是两个数字”
    • @TryinHard,修复它。只是没有修复字符串,它仍然是一个字符,如果有多个字符会被覆盖。将需要可能无限大小的缓冲区,并且不会出现该问题 - 为他/她留一些东西。
    【解决方案3】:

    不需要strtok,sscanf这里也可以实现;

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
          int firstNumber,secondNumber;
          char str[100];
          char buffer[100];
    
          printf("Enter two numbers and a string: ");
          fgets(buffer, 1024, stdin);
    
          sscanf(buffer, "%d %d %s", &firstNumber, &secondNumber, str);
          printf("%d %d %s\n",firstNumber,secondNumber,str);
    
          return(0);
    }
    

    输出

    root@viswesn-vm:/var/lib/lxc# ./a.out 
    
    Enter two numbers and a string: 2 234 king
    
    2 234 king
    

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 1970-01-01
      • 2018-08-21
      • 2014-05-13
      • 2014-05-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      相关资源
      最近更新 更多