这是我第一次在这里问一个问题,所以我会努力做到最好。我在C上不是很好,我只是在中级C编程中。
我正在尝试编写一个读取文件的程序,我正在使用它。但是我已经搜索了一个单词,然后将单词保存到数组中。我现在要做的是
for(x=0;x<=256;x++){
fscanf(file,"input %s",insouts[x][0]);
}
在文件中有一行说“输入A0;”我希望它将“A0”保存到insouts [x] [0]。 256只是我选择的数字,因为我不知道文本文件中可能有多少输入。
我的声明声明为:
char * insouts[256][2];
答案 0 :(得分:0)
您希望传递数组的第x个元素的地址,而不是存储在那里的值。您可以使用地址运算符&
来执行此操作。
我认为
for(x = 0;x < 256; x++){
fscanf(file,"input %s", &insouts[x][0]);
// you could use insouts[x], which should be equivalent to &insouts[x][0]
}
可以做到这一点:)
此外,您只为每个字符串分配2个字节。请记住,字符串需要以空字符结束,因此您应该将数组分配更改为
char * insouts[256][3];
但是,我很确定%s会匹配A0;
而不仅仅是A0
,所以您可能也需要考虑到这一点。您可以将%c与宽度一起使用来读取给定数量的字符。但是,您添加以自己添加空字节。这应该有效(未经测试):
char* insouts[256][3];
for(x = 0; x < 256; x++) {
fscanf(file, "input %2c;", insouts[x]);
insouts[x][2] = '\0';
}
答案 1 :(得分:0)
而不是尝试使用fscanf为什么不使用“getdelim”和';'作为分隔符。 根据手册页
“getdelim()的工作方式与getline()类似,不同之处在于可以将除换行符之外的行分隔符指定为分隔符参数。与getline()一样,如果输入中不存在分隔符,则不添加分隔符。文件结束了。“
所以你可以做类似的事情(未经测试和未编译的代码)
char *line = NULL;
size_t n, read;
int alloc = 100;
int lc = 0;
char ** buff = calloc(alloc, sizeof(char *)); // since you don't know the file size have 100 buffer and realloc if you need more
FILE *fp = fopen("FILE TO BE READ ", "r");
int deli = (int)';';
while ((read = getline(&line, &n, fp)) != -1) {
printf("%s", line); // This should have "input A0;"
// you can use either sscanf or strtok here and get A0 out
char *out = null ;
sscanf(line, "input %s;", &out);
if (lc > alloc) {
alloc = alloc + 50;
buff = (char **) realloc(buff, sizeof(char *) * alloc);
}
buff[lc++] = out
}
int i = 0 ;
for (i = 0 ; i < lc; i++)
printf ("%s\n", buff[i]);
答案 2 :(得分:0)
使用fgets()
&amp; sscanf()
。从格式扫描中分离I / O.
#define N (256)
char insouts[N][2+1]; // note: no * and 2nd dimension is 3
for(size_t x = 0; x < N; x++){
char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) {
break; // I/O error or EOF
}
int n = 0;
// 2 this is the max length of characters for insouts[x]. A \0 is appended.
// [A-Za-z0-9] this is the set of legitimate characters for insouts
// %n record the offset of the scanning up to that point.
int result = sscanf(buf, "input %2[A-Za-z0-9]; %n", insouts[x], &n);
if ((result != 1) || (buf[n] != '\0')) {
; // format error
}
}