修改 main的完整代码在这里http://codepad.org/79aLzj2H
再一次,这就是奇怪的行为正在发生
for (i = 0; i<tab_size; i++)
{
//CORRECT OUTPUT
printf("%s\n", tableau[i].capitale);
printf("%s\n", tableau[i].pays);
printf("%s\n", tableau[i].commentaire);
//WRONG OUTPUT
//printf("%s --- %s --- %s |\n", tableau[i].capitale, tableau[i].pays, tableau[i].commentaire);
}
我有一系列以下strcuture
struct T_info
{
char capitale[255];
char pays[255];
char commentaire[255];
};
struct T_info *tableau;
这是填充数组的方式
int advance(FILE *f)
{
char c;
c = getc(f);
if(c == '\n')
return 0;
while(c != EOF && (c == ' ' || c == '\t'))
{
c = getc(f);
}
return fseek(f, -1, SEEK_CUR);
}
int get_word(FILE *f, char * buffer)
{
char c;
int count = 0;
int space = 0;
while((c = getc(f)) != EOF)
{
if (c == '\n')
{
buffer[count] = '\0';
return -2;
}
if ((c == ' ' || c == '\t') && space < 1)
{
buffer[count] = c;
count ++;
space++;
}
else
{
if (c != ' ' && c != '\t')
{
buffer[count] = c;
count ++;
space = 0;
}
else /* more than one space*/
{
advance(f);
break;
}
}
}
buffer[count] = '\0';
if(c == EOF)
return -1;
return count;
}
void fill_table(FILE *f,struct T_info *tab)
{
int line = 0, column = 0;
fseek(f, 0, SEEK_SET);
char buffer[MAX_LINE];
char c;
int res;
int i = 0;
while((res = get_word(f, buffer)) != -999)
{
switch(column)
{
case 0:
strcpy(tab[line].capitale, buffer);
column++;
break;
case 1:
strcpy(tab[line].pays, buffer);
column++;
break;
default:
strcpy(tab[line].commentaire, buffer);
column++;
break;
}
/*if I printf each one alone here, everything works ok*/
//last word in line
if (res == -2)
{
if (column == 2)
{
strcpy(tab[line].commentaire, " ");
}
//wrong output here
printf("%s -- %s -- %s\n", tab[line].capitale, tab[line].pays, tab[line].commentaire);
column = 0;
line++;
continue;
}
column = column % 3;
if (column == 0)
{
line++;
}
/*EOF reached*/
if(res == -1)
return;
}
return ;
}
修改:
尝试这个
printf("%s -- ", tab[line].capitale);
printf("%s --", tab[line].pays);
printf("%s --\n", tab[line].commentaire);
给我结果
-- --abi -- Emirats arabes unis
我希望得到
Abu Dhabi -- Emirats arabes unis --
我错过了什么吗?
答案 0 :(得分:5)
printf有副作用吗?
好吧,它打印到屏幕上。这是副作用。除此之外:没有。
是printf更改其参数
没有
我得错了[...]发生了什么事?
如果错误的结果意味着输出没有出现,那么这可能只是一个行缓冲问题(你的第二个版本不会打印换行符,这可能导致输出无法刷新)。
答案 1 :(得分:1)
printf是你的问题极不可能。更有可能的是,你正在破坏记忆,而你对printf的奇怪结果只是一种症状。
我在代码中看到的几个地方可能会导致读取或写入数组的末尾。如果没有看到你的输入,很难说哪一个可能会导致你的问题,但这里有一些我注意到的:
get_lines_count
如果不以换行符结尾,则不计算最后一行,但您的其他方法将处理该行advance
如果前面有空格,将跳过换行符,这将导致基于列的处理结束,并可能导致某些字符串未初始化get_word
不对buffer
可能还有其他人,那些只是突然出现在我身上的人。
答案 2 :(得分:0)
我测试了你的代码,添加了缺少的部分(MAX_LINE常量,main函数和一个样本数据文件,其中三列用2+空格分隔),代码按预期工作。
也许您发布的代码仍然不完整(fill_table()从get_word()查找-999幻数,但get_word()永远不会返回),您的主函数丢失,所以我们不知道是否你正在分配内存等等。
不相关但很重要:不建议(也不可移植)在文本文件中使用fseek
进行相对移动。在这种情况下,您可能希望使用ungetc
。如果您确实想在阅读文本流时移动文件指针,则应使用fgetpos
和fsetpos
。
获得帮助的方法非常错误。你认为printf有副作用,甚至没有理解你的代码。问题显然不在printf中,但是你不必要地持有信息。您的代码不完整。您应该创建一个简化的测试用例,清楚地编译和显示您的问题,并在您的问题中完整地包含它。如果您不了解程序的真正错误,请不要责怪随机库函数。问题可以在任何地方。
答案 3 :(得分:0)
从您的评论中,我假设您使用这些printf语句,
printf("%s\n", tableau[i].capitale);
printf("%s", tableau[i].pays);
printf("%s\n", tableau[i].commentaire);
然后一切正常......
所以尝试用这个替换你的单个printf语句。 (Line no. 173)
中的 http://codepad.org/79aLzj2H printf("%s\n %s %s /n", tableau[i].capitale, tableau[i].pays, tableau[i].commentaire);