尝试将名称列表扫描为双指针

时间:2014-06-15 23:53:39

标签: c string scanf

我不知道这里有什么问题。尝试扫描名称列表: 短发 蒂姆 托尼 艾莉森 吉姆

等。进入双指针**字符串,但我不断得到一个段错误,看不到在哪里。

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");
            }
    }
}

2 个答案:

答案 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 ;
            }
    }
}