我对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;
}
}
}
}
提前致谢!
答案 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)从“文件”中读取 - 可能只是用户的键盘。
让我们依次看看这两个。
#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;
}
}
}
要从命令行中读取,我们使用两个参数声明main
:argc
和argv
。调用main
时,argc
将计算有多少个参数,argv
将包含这些参数。 argv
是一个字符串数组,或者更确切地说,是指向char
或char *
的指针数组。此外,第一个参数将始终是程序的名称。
我们希望用户输入
name_of_the_program 200
打印最多200个素数。因此我们确保用户输入至少一个参数,也就是说,如果argc
不是至少2个,我们会抱怨:一个用于程序名称,1对于用户键入的参数。假设用户 输入了一个参数,它将在argv[1]
中。 (argc[0]
是程序名。)命令行参数始终作为字符串传递,但我们需要一个数字int
。因此,我们调用atoi
将命令行上的字符串(如"200"
)转换为int
(如200
)。
在这种情况下,我们要读取的“文件”是标准输入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。作为我在此处介绍的fgets
加atoi
技术的替代方法,另一种流行的方法是scanf
函数(如图所示,事实上,在此问题的另一个答案中)。你可以使用scanf
,一开始它看起来很简单,但从长远来看它更难,并且有很多东西它根本无法处理。因此,我建议您尽快学习如何使用fgets
和朋友。]