所以我需要帮助从文件中获取的函数返回字符串数组的指针。字符串不大于10.
输入文件:
3
102
A3B
50
第一个数字是我需要多少个字符串,以下数字是我需要存储在字符串中的数字。
功能:
char ** buildArray(){
int x, i;
fscanf(fp, "%d", &x);
char answer[x][10];
for(i=0; i<x; i++){
fscanf(fp, "%s", answer[i]);
}
return answer;
}
我可以将值存储在字符串数组中并回答&#39;没错,我只是不能正确归还。
主要功能:
int main() {
char * answers;
fp = fopen("data.txt", "r");
if(fp == NULL){
printf("Could not find file.\n");
exit(EXIT_FAILURE);
}
answers = buildAnsArray();
printf("%s", answer[1]); //used as a test to see if i passed the array of strings correctly
fclose(fp);
return 0;
}
在主要功能中,当我尝试打印一个值时,它最终会崩溃或打印奇怪的符号
答案 0 :(得分:1)
假设这是C的某种风格,您试图返回一个指向变量answer
的指针,该变量在函数内自动分配,这意味着它会自动 deallocated 你退出该功能。因此,要么在此函数之外创建answer
并将其传递给要填充,要么明确地为其分配空间,以便在函数返回后它可以存活。
答案 1 :(得分:1)
正如@Scott Hunter指出的那样,当你退出函数buildArray
时,answer
超出范围,它占用的内存可以被另一个变量使用。如果您想在buildArray
内分配内存,则需要使用malloc
。一个起点是:
char *answer;
answer = malloc(x * 10 * sizeof(*answer));
但是,使用malloc
确实需要 你 来关注内存并对其进行适当管理。这意味着:
1)检查malloc
是否成功分配了内存。如果失败,则返回Null
,因此您可以添加
if(answer == NULL){
//Error Code here
}
2)完成后释放内存。这也应该安全地完成。我会在fclose
if(answer != NULL)
{
free(answer);
}
3)自己执行双索引处理。这意味着answer[i]
变为answer + i*10
或&(answer[i*10])
此外,与您的问题无关,但重要的是要注意:
1)您在主要定义中char *answer
与从char**
返回buildArray
之间的类型不匹配。打开编译器上的-Wall
和-Wextra
应警告您这些类型的事情。您应该尝试清理生成的所有警告。它们往往意味着你要么犯了一个微妙的错误,要么就是在你产生一个主要的调试问题之前使用一种你应该摆脱习惯的糟糕的编码习惯。
2)您似乎使用fp
作为全局变量。您应该尽可能地避免全局变量。可能有时候它们是必要的,但你应该在考虑它之前考虑这个问题。
3)您(正确)检查fopen
是否成功。但是,你没有检查fscanf
是否成功。你应该养成这种习惯,因为文件读取失败不会自动生成运行时错误。当它稍后使用内存中已有的任何位时,你会得到奇怪的结果。
答案 2 :(得分:0)
示例代码
#include <stdio.h>
#include <stdlib.h>
#define STRING_SIZE 10
#define S_(x) #x
#define S(x) S_(x)
char (*buildAnsArray(FILE *fp))[STRING_SIZE+1]{
int x, i;
char (*answer)[STRING_SIZE+1];
fscanf(fp, "%d", &x);
answer = malloc(x * sizeof(*answer));
for(i=0; i<x; i++){
fscanf(fp, "%" S(STRING_SIZE) "s", answer[i]);//fscanf(fp, "%10s", answer[i]);
}
return answer;
}
int main(void) {
char (*answers)[STRING_SIZE+1];
FILE *fp = fopen("data.txt", "r");//error proc omit
answers = buildAnsArray(fp);
printf("%s\n", answers[1]);//A3B
fclose(fp);
free(answers);
return 0;
}