我有这个代码需要计算多项式的合理根
dnf search java
dnf install java-1.8.0-openjdk
如果在输入的学位为2
时正确读取用户输入,则此部分仅用作测试int n,co;
char coef1[10],coef2[10],coef3[10],coef4[10];
printf("Enter the highest degree of the input polynomial:");
scanf("%d",&n);
co=n+1;
printf("Enter %d integer coefficients starting from the 0th degree\n", co);
printf("Separate each input by a comma:");
我的问题是如何打印%10 [^,]与用户输入的n相同的次数(应该可以进行无限输入)并将%s添加到结尾。而且,即使我这样做,我还需要一种方法来声明coef1,coef2等与co相同的次数。
答案 0 :(得分:2)
不太清楚你想要什么。我假设您想读入一组系数并跟踪输入的系数。
scanf
并不适合这种方法,因为您必须在格式文件中指定要读取的参数数量。 scanf
也无法识别新行,因此如果没有巴洛克式格式语法,则无法读取基于行的格式。 fgets
读取整行。 strtok
分隔某些分隔符处的字符串。你可以使用这些的组合。
接下来,您应该确定如何存储系数。使用coef1
,coef2
等单个实体并不是很有用。使用数组。
将这些付诸实践(尽管对于浮点数系数),你得到:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define N 10
int coeff_read(char *line, double coeff[], int max)
{
int n = 0;
char *token = strtok(line, ",");
while (token) {
char *tail;
double x = strtod(token, &tail);
if (tail == token) return -1;
if (n < max) coeff[n] = x;
n++;
token = strtok(NULL, ",");
}
return n;
}
void coeff_print(const double *coeff, int n)
{
for (int i = 0; i < n; i++) {
if (i) printf(", ");
printf("%g", coeff[i]);
}
puts("");
}
int main()
{
char line[200];
double coeff[N];
int ncoeff;
while (fgets(line, sizeof(line), stdin)) {
ncoeff = coeff_read(line, coeff, N);
if (ncoeff < 0) {
puts("Invalid input.");
continue;
}
if (ncoeff > 0) {
if (ncoeff > N) ncoeff = N;
coeff_print(coeff, ncoeff);
}
}
return 0;
}
注意事项:
N
。只有ncoeff
个有效。这是C中的常用方法,但这意味着您输入的系数最多为N
。coeff_read
返回系数的实际数量,这可能超过数组大小。这在此示例中没用,但您可以使用此信息来扫描字符串{{1} },根据需要进行分配,然后再使用分配的数据进行扫描。)max == 0
将连续逗号(例如strtok
)视为一个单独的分隔符。例如,如果您希望空条目表示零,则您必须使用其他方法。,,,
在其返回值,尾部指针和库的错误代码strtod
中提供了更多信息。您可以利用它来查明数字是否超出范围或者后面有额外的cahacter。为了明智(和懒惰),我没有。errno
是等效于strtol
的整数。答案 1 :(得分:0)
不建议使用无限输入,因为这是一个安全漏洞。而是允许许多。
要在一行中使用scanf("%lf", &data)
,首先需要使用其他代码查找'\n'
。
#include <ctype.h>
#include <stdio.h>
int GetLineOfDoubles(FILE *stream, double *dest, size_t length) {
int i = 0;
int ch;
while (1) {
while (isspace(ch = fgetc(stream)) && ch != '\n')
;
if (ch == '\n' || ch == EOF) break;
if (i > 0) {
if (ch != ',') return 0; // Missing comma
while (isspace(ch = fgetc(stream)) && ch != '\n')
;
if (ch == '\n' || ch == EOF) return 0; // Missing data
}
ungetc(ch, stdin);
double data;
if (scanf("%lf", &data) != 1) return 0; // Bad data
if (i == length) return 0; // Too much data
dest[i++] = data;
}
if (i > 0) return i;
return ch == EOF ? EOF : 0;
}