变量由输入定义

时间:2017-09-03 10:50:59

标签: c variables

我对C很陌生,我想知道是否可以通过用户的输入来定义变量。我做了一个简单的素数计数器,显示从1到100的所有素数,我想知道是否有一个库或代码允许我通过用户输入定义一个变量。 Here's my code for better understanding.

#include <stdio.h>

int main(void)
{
    for (int i = 2; i < 101; i++) { //I would want the "101" to be a user defined variable
        for (int j = 2; j <= i; j++) {
            if (i == j) {
                printf("%d\n", i);
            }
            else if (i%j == 0) {
                break;
            }
        }
    }
}

提前致谢!

2 个答案:

答案 0 :(得分:3)

#include <stdio.h>

int main(void) {
   int num;
   scanf("%d",&num); //to take a user input
 for (int i=2; i<=num; i++) //I would want the "101" to be a user defined variable
 {
  for (int j=2; j<=i; j++)
  {
    if (i == j)
      printf("%d\n",i);
    else if (i%j == 0)
      break;
  }
 }
}

答案 1 :(得分:2)

是的,可以通过这种方式使用用户输入。 (最好是可能的!实际上所有程序都可以处理用户输入。)

一般来说,有两种主要方式。 (1)从命令行读取。 (2)从“文件”中读取 - 可能只是用户的键盘。

让我们依次看看这两个。

1。从命令行中读取。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
 int max;
 if(argc <= 1)
 {
  fprintf(stderr, "usage: %s max\n", argv[0]);
  exit(1);
 }
 max = atoi(argv[1]);
 for (int i=2; i<max; i++)
 {
  for (int j=2; j<=i; j++)
  {
    if (i == j)
      printf("%d\n",i);
    else if (i%j == 0)
      break;
  }
 }
}

要从命令行中读取,我们使用两个参数声明mainargcargv。调用main时,argc将计算有多少个参数,argv将包含这些参数。 argv是一个字符串数组,或者更确切地说,是指向charchar *的指针数组。此外,第一个参数将始终是程序的名称。

我们希望用户输入

name_of_the_program 200

打印最多200个素数。因此我们确保用户输入至少一个参数,也就是说,如果argc不是至少2个,我们会抱怨:一个用于程序名称,1对于用户键入的参数。假设用户 输入了一个参数,它将在argv[1]中。 (argc[0]是程序名。)命令行参数始终作为字符串传递,但我们需要一个数字int。因此,我们调用atoi将命令行上的字符串(如"200")转换为int(如200)。

2。从文件中读取。

在这种情况下,我们要读取的“文件”是标准输入stdin,默认情况下是用户的键盘。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
 int max;
 char input_line[100];
 printf("How high to go? "); fflush(stdout);
 fgets(input_line, 100, stdin);
 max = atoi(input_line);
 if(max == 0)
 {
  fprintf(stderr, "try typing a number next time\n");
  exit(1);
 }
 for (int i=2; i<max; i++)
  ...

我们打印一个提示,告诉用户我们需要他输入什么。我们打电话给

 fgets(input_line, 100, stdin);

读取一行输入 - 也就是说,我们希望用户键入一些内容,然后点击RETURN。由于我们将input_line声明为100个字符的数组,因此我们告诉fgets它有多大是很重要的,这样fgets可以确保不会将超过100个字符放入阵列。 (如果用户在打到RETURN之前键入100个或更多字符,则可能会发生这种情况。)

与命令行案例类似,我们将input_line读作一行文本,即字符串。我们再次致电atoi,将该字符串转换为int。此外,我们确保数字不是0.如果用户键入“abc”或其他东西,甚至不是数字,atoi将返回0,我们抓住了,因为我们永远不会想要尝试打印最高为0的素数。

[P.S。作为我在此处介绍的fgetsatoi技术的替代方法,另一种流行的方法是scanf函数(如图所示,事实上,在此问题的另一个答案中)。你可以使用scanf,一开始它看起来很简单,但从长远来看它更难,并且有很多东西它根本无法处理。因此,我建议您尽快学习如何使用fgets和朋友。]