如何创建一个程序来读取c中用逗号分隔的无限用户输入字符串?

时间:2015-09-26 06:55:13

标签: c

我有这个代码需要计算多项式的合理根

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相同的次数。

2 个答案:

答案 0 :(得分:2)

不太清楚你想要什么。我假设您想读入一组系数并跟踪输入的系数。

scanf并不适合这种方法,因为您必须在格式文件中指定要读取的参数数量。 scanf也无法识别新行,因此如果没有巴洛克式格式语法,则无法读取基于行的格式。 fgets读取整行。 strtok分隔某些分隔符处的字符串。你可以使用这些的组合。

接下来,您应该确定如何存储系数。使用coef1coef2等单个实体并不是很有用。使用数组。

将这些付诸实践(尽管对于浮点数系数),你得到:

#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
  • 如果你真的想要&#34;无限&#34;输入,你必须迎合大数组。动态分配可以提供可变大小的数组。这是一个高级主题。 (函数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;
}