我正在尝试扫描输入文档。它具有以下格式。 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次。它已经这样做了,不是吗?
答案 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
N
,指定no。要扫描的表达式。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)然后程序将读取超过行的结尾并继续前进,直到它在缓冲区外的随机存储器中找到'。'或者您尝试读取导致程序错误的内存。