我有一个包含此类数据的文件
{0 /Data1/ , 0x00, 0, 0xFF},
{1 /data2/ , 0x00, 0, 0xFF},
{2 /data3/ , 0x00, 0, 0xFF},
{3 /data4/ , 0x00, 0, 0xFF}, ...
我想只打印每行的第二列。以下是我工作的代码。
#include<stdio.h>
#include<string.h>
int main ()
{
char filename[] = "file.txt";
FILE *file = fopen(filename, "r");
if(file!= NULL)
{
char line[128];
char * word1;
char word2;
char word3;
int i=0;
clrscr();
while ( fgets( line, sizeof line, file)!= NULL)
{
i=0;
word1 = strtok(line, " ,");
while(word1!= NULL)
{
i++;
if(i==2 ){
printf("%s\n",word1);
}
word1 = strtok(NULL," ,");
}
}
fclose(file);
}
else
{
perror(filename);
}
getch();
return 0;
}
它工作正常。我可以将每行中打印的值保存到数组中吗? 我试过这样的事情
if(i==2){
word2 = * (word1);
}
printf("%s\n",word1);
但是它给了我一个空指针赋值。如何将值Im打印存储到数组中?
答案 0 :(得分:1)
您只将字符串word1的第一个字符保存到word2中。
如果你想要存储所有第二列,你需要为(char *)分配一个动态指针数组,然后为每个单词/列分配空间,并使用strcpy复制,因为word1在每次迭代时都会发生变化所以你不能只保存戒备。
答案 1 :(得分:0)
您可以使用动态分配的数组,随着需要更多空间而增长。 有关更多帮助,请参阅Why does a large variable length array has a fixed value -1 even if assigned to in C?。
答案 2 :(得分:0)
尝试这样的事情:
#define MAX_BUFFER_SIZE 256
/* ... */
char ** lines = malloc(MAX_BUFFER_SIZE + 1);
char ** p = lines;
char ** newbuf;
int len;
int bytesloaded = 0;
int buf_size = MAX_BUFFER_SIZE;
assert(lines != NULL);
//... loop etc..
if(i==2 ){
len = strlen(word1);
bytesloaded += len;
if(bytesloaded >= buf_size) /* Controls buffer size. For avoid buffer overflow/heap corruption/UB. */
{
buf_size += MAX_BUFFER_SIZE;
newbuf = realloc(lines, buf_size);
if(!newbuf) /* return or break. */
{
printf("Allocation failed.\n");
free(lines);
return 1;
}
lines = newbuf;
}
*p++ = word1; /* store the word in lines */
printf("%s\n",word1);
}
注意:在第一次循环结束后,不要忘记将0终结符\0
放在数组中。
我没有测试过这段代码,但我相信它有效。
这是一个简单的例子:a dynamic memory allocation
,控制它的大小,内存重新分配和值存储。