我不知道这里有什么问题。尝试扫描名称列表: 短发 蒂姆 托尼 艾莉森 吉姆
等。进入双指针**字符串,但我不断得到一个段错误,看不到在哪里。
void insert_data(char **strings, const char *filename, int size)
{
int j = 0;
FILE* file = fopen(filename, "r");
if(file == NULL)
{
printf("File could not be opened");
return;
}
for(j=0; j<size; j++)
{
fscanf(file,"%s", strings[j]);
printf("%s\n", strings[j]);
}
fclose(file);
}
我有一个单独的函数来分配内存,但它仍然存在错误
void allocate(char ***strings, int size)
{
strings = malloc(size * sizeof(char*));
if(strings == NULL)
{
printf("Could not allocate memory\n");
}
int i;
for(i=0;i<size;i++)
{
*(strings+i) = malloc(MAX_STRING_LEN * sizeof(char));
if(strings == NULL)
{
printf("Could not allocate memory\n");
}
}
}
答案 0 :(得分:1)
你的功能的核心或多或少的声音;问题更多的是你调用它的方式而不是函数本身。以下代码只对函数中的代码进行了少量修复,可以正常工作。
#include <stdio.h>
static int insert_data(char **strings, const char *filename, int size)
{
int j = 0;
FILE *file = fopen(filename, "r");
if (file == NULL)
{
fprintf(stderr, "File %s could not be opened\n", filename);
return 0;
}
for (j = 0; j < size; j++)
{
if (fscanf(file, "%s", strings[j]) != 1)
return j;
printf("%s\n", strings[j]);
}
fclose(file);
return size;
}
int main(int argc, char **argv)
{
char data[10][20];
char *str[10];
if (argc != 2)
{
fprintf(stderr, "Usage: %s file\n", argv[0]);
return 1;
}
for (int i = 0; i < 10; i++)
str[i] = data[i];
int n = insert_data(str, argv[1], 10);
for (int i = 0; i < n; i++)
printf("%d: [%s] [%s]\n", i, str[i], data[i]);
// Invalid - incompatible pointer type!
// int m = insert_data(data, "data2", 10);
return 0;
}
请注意,给定函数原型,您必须传递指针数组,而不是尝试将指针传递给2D字符数组。如果您试图滥用该函数,编译器会发出警告。
答案 1 :(得分:0)
更改为
#define _S(x) #x
#define S(x) _S(x)
void insert_data(char **strings, const char *filename, int size)
{
int j = 0;
FILE* file = fopen(filename, "r");
if(file == NULL)
{
printf("File could not be opened");
return;
}
for(j=0; j<size; j++)
{
fscanf(file, "%" S(MAX_STRING_LEN) "s", strings[j]);//E.G. #define MAX_STRING_len 64
printf("%s\n", strings[j]);
}
fclose(file);
}
void allocate(char ***strings, int size)
{
*strings = malloc(size * sizeof(char*));
if(*strings == NULL)
{
printf("Could not allocate memory\n");
return ;
}
int i;
for(i=0;i<size;i++)
{
(*strings)[i] = malloc((MAX_STRING_LEN+1) * sizeof(char));
if((*strings)[i] == NULL)
{
printf("Could not allocate memory\n");
return ;
}
}
}