Tyl*_*eat 1 c arrays file fgets
我有一个文本文件,最多100个IP地址,每行1个.我需要将每个地址作为字符串读入名为"list"的数组中.首先,我假设"list"需要是一个二维char数组.每个IP地址长度为11个字符,如果包含"\ 0"则为12个,因此我声明列表如下:
char list[100][12];
接下来,我尝试使用fgets来读取流:
for (i = 0; i < 100; i++)
{
if (feof(stream))
break;
for (j = 0; j < 12; j++)
fgets(&list[i][j], 12, stream);
count++;
}
Run Code Online (Sandbox Code Playgroud)
要检查字符串是否已正确读取,我尝试输出它们:
for (i = 0; i < 5; i++)
{
for (j = 0; j < 11; j++)
printf("%c", list[i][j]);
printf("\n");
}
Run Code Online (Sandbox Code Playgroud)
运行程序后,很明显出错了.作为初学者,我不确定是什么,但我猜我正在读错文件.没有错误.它编译,但在两行打印一个奇怪的地址.
编辑:
我用这个替换了fgets代码:
for (i = 0; i < 100; i++)
{
if (feof(stream))
break;
fgets(list[i], 12, stream);
count++;
}
Run Code Online (Sandbox Code Playgroud)
它现在打印五个字符串,但它们是来自内存的"随机"字符.
一,阅读:
for (j = 0; j < 12; j++)
fgets(&list[i][j], 12, stream);
Run Code Online (Sandbox Code Playgroud)
你这里有一个大问题.这是尝试将字符串读入数组中的每个连续字符.
总而言之,我认为你让它变得比它需要的复杂得多.将您的数组视为100个字符串,并且fgets一次使用一个字符串.这意味着阅读可能看起来像这样:
for (i=0; i<100 && fgets(list[i], 11, string); i++)
;
Run Code Online (Sandbox Code Playgroud)
还有另外一个小细节需要处理:fgets()通常在每行末尾保留换行符.因此,您可能需要留有余地13个字符(11地址,1新线,1 NUL终止),否则你可能需要将数据读入临时缓冲区,并将其复制到你的list后只你已经剥离了新线.
在您当前打印字符串的代码中,您一次只能处理一个字符,这可能会起作用,但这是不必要的困难.有几个人建议使用%s printf转换,这本身就很好.但是,要使用它,您必须简化索引.打印前六个地址看起来像这样:
for (i=0; i<6; i++)
printf("%s", list[i]);
Run Code Online (Sandbox Code Playgroud)