【发布时间】:2014-10-06 09:35:11
【问题描述】:
我正在尝试用 C 编写一个基本的测验程序。它基本上会存储卡片和答案。 但与此同时,我正在尝试使用我学到的新技术,如可变参数函数和动态内存分配。
我希望程序能够在我更改常量时进行扩展,不应该有 K&R 定义的“幻数”。问题是我不能在 fscanf 的格式参数中使用变量。我需要手动定义字符串长度。为了克服这个限制,我尝试编写一个字符串连接函数,它将生成 fscanf 格式参数。
例如
char * scanf_string = et_concat(5, "%", CARD_SIZE, "s | %", ANSWER_SIZE, "s");
常量在 consts.h 中定义
#define CARD_SIZE 200
#define ANSWER_SIZE 1000
#define CONCAT_SIZE 20
et_concat 函数在 etstring.h 中。 这是发生分段错误的地方。
#include <stdarg.h>
#include <string.h>
char * et_concat (int count, char * str, ...)
{
va_list ap;
int j;
char *concatted_string = (char *) malloc (count*CONCAT_SIZE+1);
va_start(ap, str);
for (j = 0; j < count; j++) {
strcat(concatted_string, va_arg(ap, char *));
}
va_end(ap);
return concatted_string;
}
我试图调用 et_concat 的代码在 reader.c 中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "consts.h"
#include "etstring.h"
int iterate_inputs()
{
char card[CARD_SIZE];
char answer[ANSWER_SIZE];
FILE *fp = fopen("data.txt","r");
if (fp == NULL)
{
return EXIT_FAILURE;
}
char * scanf_string = et_concat(5, "%", CARD_SIZE, "s | %", ANSWER_SIZE, "s");
printf(scanf_string);
fscanf(fp, scanf_string, card, answer);
printf("%s | %s\n", card, answer);
fclose(fp);
return EXIT_SUCCESS;
}
非常感谢。
【问题讨论】:
-
您的函数需要 5 个 C 字符串,但
CARD_SIZE和ANSWER_SIZE是整数常量。您可以编写一个函数或宏来对它们进行字符串化。 -
printf(str)- 请不要那样做。如果字符串恰好包含%,会发生什么?请使用printf("%s", str)或puts(str)。
标签: c malloc dynamic-memory-allocation scanf variadic-functions