【问题标题】:How do I save integers read by getchar() to an array?如何将 getchar() 读取的整数保存到数组中?
【发布时间】:2016-03-24 16:44:25
【问题描述】:

我正在尝试制作一个程序,该程序将使用getchar() 读取三个整数并将其存储在一个数组中,但我的代码有问题。

#include <stdio.h>
int main( )
{
    printf("Please enter three digit number 100 to 999: ");
    int numEntered[2];
    numEntered = getchar();
    for (int i = 0; i<3; i++) {
        printf("%d", numEntered[i])
    }
}

【问题讨论】:

  • 发生了什么?
  • 0) 启用编译器警告。他们不只是为了展示一些技术喋喋不休。 1)缩进你的代码。 2)使用调试器并查看循环交互的次数(以及遇到麻烦的位置)。 3)这已经被问过很多次了。 4) 或者重新阅读你的 C 书籍中的数组。
  • 如果我理解正确,您是否假设如果用户键入“746”,则说 'numEntered[0] = 7'、'numEntered[1] = 4' 和 'numEntered[2] = 6'。这不是它的工作方式。

标签: c arrays getchar


【解决方案1】:

试试这个:

#include <stdio.h>

int main(){

    printf("Please enter three digit number 100 to 999: ");

    int numEntered[3];

    for (int i = 0; i<3; i++){
        scanf("%d", &numEntered[i]);
        printf("%d", numEntered[i]);
    }

    return 0;  
}

您需要在 for 循环中读取一个值!第二件事,通过使用 getchar() 读取,您将获得字符的 ascii 值,所以.. 如果您读取“1”并使用 %d 打印,您实际上打印的是 49!

在此处查看 ascii 表:http://www.asciitable.com/index/asciifull.gif

【讨论】:

  • 我试过了,但他们的 for 循环似乎有问题。
  • 您确实意识到这样您读取的是 3 个整数而不是 3 位整数;您可以阅读 8888 9999 11111,这不是问题所在...
  • @Pandrei 我认为答案是正确的!这个案例'8888 9999 11111'的测试你必须处理用户输入,使用if或while,例如,即使使用getchar(),什么会阻止你输入像'abc'这样的字母而不是三位数字?还是一样的情况..你必须处理用户输入,通过使用一些条件来防止错误的案例测试
  • @HanArantes 这比 getchar 更容易出错......很容易错误地输入 2 位数字......不管你为输入添加什么检查
【解决方案2】:

让我们试着思考一下这里的问题:

  • 是否要读取和存储整数值?如果是 -> 使用scanf
  • 您想逐位读取数字吗?如果是 -> 使用getchar
  • 您想确保您阅读的内容正好是 3 位数字吗?如果是...如果不是,你会怎么做?
  • 如果逐位读取,请确保您正在读取数字; getchar 读取字符 -> 使用 atoi 函数或检查 ascii 值;

把它们放在一起(做了一些假设):

int main()
{
   char digits[3]; // don't use ints to store chars...
   printf("enter the 3 digit number - 100 to 999: ");   

   for (int i=0;i<3;i++) // only the first 3 chars are read
   {
       char c = getchar();
       if (char < '0') || (char > '9')
       {
           printf("invalid digit!");
           exit(0);
       }
       digits[i] = c;
   }

   printf("the number entered is: %c%c%c", digits[0],digits[1],digits[2]);
}

【讨论】:

    【解决方案3】:

    您不使用 getchar 来获取整数值。 请改用 scanf()。

    试试这个:

    #include <stdio.h>
    int main( )
    {    
    printf("Please enter three digit number 100 to 999: ");
    int numEntered[3];  
    for (int i = 0; i<3; i++){
       scanf("%d",&a[i]);
       printf("%d", numEntered[i]);
    }
    }
    

    【讨论】:

    • 我想过使用 scanf 但问题是以后我将不得不更改每个数字的位置。例如,如果读取的数字是 129,我必须再输入一个整数 291,然后再输入 912。
    • 您可以使用整数数组来完成。 q=a[i]/100; a[i]=a[i]%100;a[i]=a[i]*10+q; 将代码放入 for 循环中
    • 哦,好的,谢谢。但是你知道我的 for 循环有什么问题吗?
    • getchar() 返回单个字符而不是数组。如果我认为它是一个 C 程序,你不能在 for 循环中声明一个变量。
    【解决方案4】:

    numEntered = getchar();
    (1) 不能赋值给数组本身。
    (2) getchar() 读取一个字符。


    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    
    int main(void){
        char digits[4]  = {0};//4: 3 character + NUL character
        int ch, value;
    
        do {
            printf("Please enter three digit number 100 to 999: ");
            for(int i = 0; i < 3 && (ch = getchar()) != '\n' && ch != EOF; ++i){
                digits[i] = ch;
            }
            if(ch != '\n')
                while((ch = getchar()) != '\n')
                    if(!isspace(ch))//invalid input
                        *digits = 0;
    
            value = atoi(digits);
        } while(value < 100 || 999 < value);
    
        char *rotate_left(char digits[4]);
    
        printf("%d\n", value);
        printf("%d\n", atoi(rotate_left(digits)));
        printf("%d\n", atoi(rotate_left(digits)));
    
        return 0;
    }
    
    char *rotate_left(char digits[4]){
        char temp = digits[0];
        digits[0] = digits[1];
        digits[1] = digits[2];
        digits[2] = temp;
        return digits;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-30
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      相关资源
      最近更新 更多