【发布时间】:2012-05-17 19:11:00
【问题描述】:
我有一个奇怪的问题,我不知道如何解决它。
我正在读取一个 50x50 字符的文本文件,并希望将其写入一个 50x51 的动态数组(用 '\0' 填充第 51 个插槽)。
之后,我将整个数组打印到控制台上。 它应该显示 50 行,每行 50 个字符,因为这是输入。
它也很好用——除了第一行。由于某种原因总是错误的。
#define FIELD_SIZE 50
int main(int argc, char** args){
char* data = ReadFile("start.txt");
char** map = (char**) malloc( FIELD_SIZE );
if(map==NULL)
__debugbreak();
{
int i;
for(i = 0; i < FIELD_SIZE; i+=1){
map[i] = (char*) malloc(FIELD_SIZE+1);
if(map[i]==NULL)
__debugbreak();
//(FIELD_SIZE+1) in order to skip the '\n' at the end of each line.
memcpy( &map[i][0], &data[i*(FIELD_SIZE+1)], FIELD_SIZE);
map[i][FIELD_SIZE] = '\0';
}
}
{
int i;
for(i = 0; i < FIELD_SIZE; i+=1){
printf("%s\n", map[i]); //<-- prints something bad for i==0
}
}
free(data);
return 0;
}
这是我的控制台在程序执行后的样子: 第一行也应该是“aaaaaaaaaaaaaa ...”。 所以这似乎是一个错误的指针或其他东西。
如果我将 FIELD_SIZE 减小到 20(并分别读取 20x20 文本文件),它可以正常工作。
我没有看到数组大小和第一个索引之间的联系不起作用。由于 malloc 从未返回 0,因此分配没有问题。
我正在使用VS2010 C++编译程序,但我必须将自己限制在C子集。
【问题讨论】:
-
你确定你的文件没问题吗?
-
该文件是一个 ANSI 编码的常规文本文件(使用 np++)。它只包含 20 行,每行 20 个 a。由于除第一行之外的所有内容都有效,我认为问题不直接在于读取文件。正如我所说,如果我减少 FIELD_SIZE 一切正常,所以它不是文件中的“隐藏”有问题的字符或类似字符。
-
添加了要发布的图片,这样即使引用的图片网站不再有效,未来的访问者也能理解问题。
-
出于好奇,如果在将行读入数组后立即打印出来会怎样?
-
@Michael - 实际上打印了正确的字符串。所以有证据表明出错的不是文件读取。
标签: c arrays visual-studio-2010 pointers