读取输入直到" dot"。未知大小的字符串

时间:2014-03-16 06:42:54

标签: c string scanf

我正在尝试扫描输入文档。它具有以下格式。 N - 文件中的字符串数。一些字符串(带整数的算术表达式)除以点。我正在编写代码,但答案是错误的。

    int N;
fscanf(input, "%i", &N);
int m=5,i;
char ch;
char expression[m];
for(i=0;ch!='.';i++){
    fscanf(input,"%c",&ch);
    expression[i]=ch;
}

printf("%s", expression);

说,输入是

52+3.

即。将有5个表达式,其中第一个是(2 + 3)。 但是,该部分的打印输出是:

+3.

任何错误的想法? 另外,你能建议一种循环扫描输入的方法吗?因此,如果N = 5,则扫描文档5次。它已经这样做了,不是吗?

3 个答案:

答案 0 :(得分:1)

要使fscanf在解析整数时只消耗1个字符,请执行:

fscanf(input, "%1d", &N);

此外,您的expression数组仅包含5个字符的空间。也许你想创建一个包含5个字符数组的数组(每个数组都有100个字符的空格),这样你就可以读取所有的表达式。

char expressions[5][100];

这样你就可以在循环中读取表达式:

int i;
int j;
int c;

for(i = 0; i < N; i++) {
    j = 0;
    while((c = fgetc(input)) != '.')
        expressions[i][j++] = c;
    expressions[i][j] = '\0';
}

请注意,此处没有错误检查,因此如果输入错误,则会发生错误。

答案 1 :(得分:1)

<强>代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
main()
{
    FILE* input=fopen("new.txt","r");
    int N, n=1;
    int i;
    char line[80], *pLine=malloc(10);
    fscanf(input,"%d",&N);
    fscanf(input,"%s",line);
    pLine=strtok(line,".");
    while(n<=N)
    {
        printf("%s\n",pLine);
        pLine=strtok(NULL,".");
        n++;
    }
    fclose(input);
}

文件内容(new.txt):

5
3+2.4+5.6+7.8+9.10+11.100+200
  1. 扫描文件一次,查找整数N,指定no。要扫描的表达式。
  2. 扫描包含点分隔表达式的下一行。
  3. 使用strtok()并以"."作为分隔符对该行进行细分。

答案 2 :(得分:1)

您的计划有几个问题。虽然我不完全确定我理解您的规范,但第一个问题是%i(您应该使用%d)将消耗看起来像数字的字符数。因此,它实际上是在读取52而不是5,正如您可能期望的那样。如果您知道该值是单个数字,那么您可以尝试使用%1d作为第一个格式语句“fscanf(input,”%1d“,&amp; N)”。你也没有真正用N中的值做任何事情。我也不确定为什么你在第三行使用数字5。

无论如何,这是一个可能的解决方案(有很多方法可以做到这一点)。我的解决方案可以假设我理解你的问题陈述,尽管我没有做很多防御性编程。使用C和C ++等语言时,在填充不超出数组的数组时必须小心,并在为缓冲区保留的内存之外写入。

int n;
char buff[100];
fscanf(stdin, "%1d%s", &n, buff); /* %1d tells fscanf to read 1 integer character */
int i=0;
while(n) {
    while(buff[i] != '.') {
        putchar(buff[i]);
        i++;
    }
    i++; /* skip past '.' */
    --n;
    putchar('\n'); /* new line */
}

如果您的输入是:

52+3.4+7.5+9.4+3.3+3.

然后输出应该是:

2+3
4+7
5+9
4+3
3+3

我也假设输入格式正确。在现实世界中,你不能永远 假设这样,你需要确保你不要做像读取缓冲区之类的事情。例如,如果最后一个'。'缺少(或者'。'字符少于表达式计数(5)然后程序将读取超过行的结尾并继续前进,直到它在缓冲区外的随机存储器中找到'。'或者您尝试读取导致程序错误的内存。