我的getNumber函数有问题,因为我的output_file包含零。在我看来,它不应该。我希望我的程序打印所有数字,然后将它们添加起来。
以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define CHUNK 12
char *getNumber(FILE *infile);
int main(int argc, char *argv[])
{
char *number, *pEnd;
FILE *infile, *outfile;
int newNumber, sum = 0;
if(argc != 3)
{
printf("Missing argument!\n");
exit(1);
}
infile = fopen(argv[1], "r");
if(infile != NULL)
{
outfile = fopen(argv[2], "w");
if(outfile == NULL)
{
printf("Error, cannot open the outfile!\n");
abort();
}
else
{
while(!feof(infile))
{
number = getNumber(infile);
if(number == NULL)
{
free(number);
abort();
}
newNumber = strtol(number, &pEnd, 10);
sum += newNumber;
if(!*pEnd)
printf("Converted successfully!\n");
else printf("Conversion error, non-convertible part: %s", pEnd);
fprintf(outfile, "%d\n", newNumber);
free(number);
}
fprintf(outfile, "\nSum: %d\n", sum);
}
}
else
{
printf("Error, cannot open the infile!\n");
abort();
}
fclose(infile);
fclose(outfile);
return 0;
}
char *getNumber(FILE *infile)
{
char *number, *number2;
int length, cursor = 0, c;dwwd
number = (char*)malloc(sizeof(char)*CHUNK);
if(number == NULL)
{
printf("Error!\n");
return NULL;
}
length = CHUNK;
while(!isspace(c = getc(infile)) && !feof(infile))
{
if(isdigit(c))
{
number[cursor] = c;
cursor++;
if(cursor >= length)
{
length += CHUNK;
number2 = (char*)realloc(number, cursor);
if(number2 == NULL)
{
free(number);
return NULL;
}
else number = number2;
}
}
}
number[cursor] = '\0';
return number;
}
我真的很感激任何帮助。
我也发送了两个文件,input_file和output_file:
答案 0 :(得分:1)
你的情况:
while(!isspace(c = getc(infile)) && !feof(infile))
每次遇到空间时都会中断。之后,您将始终打印该号码。这意味着对于不直接在数字之前的每个间隔(也用于文件末尾),您将在输出文件中打印一个额外的零。
如果您至少输入一次,可能会添加一个标记。如果你还没有 - 只是不打印任何东西。
答案 1 :(得分:0)
来自strtol c库联机帮助页:
如果根本没有数字,strtol()会存储 nptr在* endptr中的原始值(并返回0)
您总是分配给newNumber,并且不检查strtol实际上没有返回转换后的数字的情况,而是返回0,因为它找不到数字。这就是你输出文件中包含所有零的原因。
答案 2 :(得分:0)
你必须在if(isdigit(c))中添加else语句,以便在找到之前的数字后找到非数字字符时打破循环。
if(isdigit(c))
{
// your existing code
}
else if (cursor != 0)
{
break;
}
希望这有帮助。
修改强>
只需替换
fprintf(outfile, "%d\n", newNumber);
与
if(0 != newNumber) fprintf(outfile, "%d\n", newNumber);