我的文本文件格式如下:
my.txt
Red
Green
Blue
Yellow
我想要得到这样的话:
typedef char * string;
main(){
int i;
string array[4];
FILE *my;
my = fopen("my.txt","r");
for(i = 0; i < 4; i++)
fscanf(data, "%s", &array[i]);
fclose(my);
}
当我尝试打印阵列时出现错误。我的代码出了什么问题,如何解决?
答案 0 :(得分:2)
您需要为以null结尾的字符串分配内存。
目前您只为4 char *
分配内存,但这些指针未初始化,因此当您尝试将数据写入内存时,将导致 UB (未定义的行为)他们指出。
工作示例代码段
在下面的代码段中使用“%127s ”是为了防止我们在分配的内存范围之外写入。如果有问题的 format-string ,我们将最多读/写127字节+空终止符。
请记住,如果要在“现实生活中”使用它,则应实施进一步的错误检查。
file_handle
是否确实有效
malloc
确实分配了请求的内存fscanf
是否已阅读所需的输入#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int
main (int argc, char *argv[])
{
int i;
char * lines[4];
FILE *file_handle = fopen ("my.txt", "r");
for (i =0; i < 4; ++i) {
lines[i] = malloc (128); /* allocate a memory slot of 128 chars */
fscanf (file_handle, "%127s", lines[i]);
}
for (i =0; i < 4; ++i)
printf ("%d: %s\n", i, lines[i]);
for (i =0; i < 4; ++i)
free (lines[i]); /* remember to deallocated the memory allocated */
return 0;
}
<强>输出强>
0: Red
1: Green
2: Blue
3: Yellow
答案 1 :(得分:1)
您尝试读取一些数据,但是您无处可读。你所拥有的只有4个指针,指向上帝知道你在哪里,你正试图写入它!
有很多方法可以做到这一点:
您知道数据大小的界限:
#include <stdio.h>
#define MAX_CHARS 20
typedef char string[MAX_CHARS+1]; // leave one space for '\0'
main(){
int i;
string array[4];
FILE *my;
my = fopen("my.txt","r");
for(i = 0; i < 4; i++)
fscanf(data, "%s", array[i]); // no need for & with %s
fclose(my);
}
假设绑定到数据的大小,并忽略其余的字符串(如果它太大):
#include <stdio.h>
#define MAX_CHARS 20
#define MAX_CHARS_STR "20" // there are better ways to get this
typedef char string[MAX_CHARS+1];
main(){
int i;
string array[4];
FILE *my;
my = fopen("my.txt","r");
for(i = 0; i < 4; i++){
fscanf(data, "%"MAX_CHARS_STR"s", &array[i]); // read at most 20 chars for the string
ungetc('x', data); // append one character to make sure we don't hit space
fscanf(data, "%*s"); // ignore whatever is left of string
}
fclose(my);
}
读取文件两次,第一次找出每个字符串的大小(或简单的最大大小),然后为字符串分配内存(使用malloc
)。然后再次读取文件,这次实际存储字符串:
#include <stdio.h>
typedef char *string;
main(){
int i;
string array[4];
int cur_size = 0;
FILE *my;
my = fopen("my.txt","r");
for(i = 0; i < 4; i++){
fscanf(data, "%*s%n", &cur_size);
array[i] = malloc((cur_size+1)*sizeof(*array[i]));
}
fclose(my);
my = fopen("my.txt","r");
for(i = 0; i < 4; i++){
fscanf(data, "%s", array[i]);
}
fclose(my);
// and when done:
for(i = 0; i < 4; i++){
free(array[i]);
}
}
通过块读取输入块。对于每个字符串,如果输入字符串尚未完成,请调整为字符串分配的内存(增加其大小),读取另一个块并再次检查。方法3虽然更快但我推荐它,但是你知道,这基本上是在C ++的string
中发生的事情。
答案 2 :(得分:1)
因为所有其他答案都告诉你你做错了什么而不是如何解决它。这里
typedef char * string;
#define LEN 100 //long enough for your line
main(){
int i;
string array[4];
for(i = 0; i < 4; i++) {
if((array[i] = (char *)(malloc(sizeof(char) * LEN))) == NULL) {
printf("malloc failed");
return 1;
}
}
FILE *my;
my = fopen("my.txt","r");
for(i = 0; i < 4; i++)
fscanf(data, "%s", &array[i]);
fclose(my);
}
就像他们说你为指针腾出空间而不是指针指向的东西。