2

这是我第一次在这里提问,所以我会尽力做到最好。我在 C 方面不是很好,我只在中级 C 编程方面。

我正在尝试编写一个读取文件的程序,我开始工作了。但是我已经搜索了一个单词,然后将它之后的单词保存到一个数组中。我现在要做的是

for(x=0;x<=256;x++){
 fscanf(file,"input %s",insouts[x][0]);
 }

在文件中有几行说“输入A0;” 我希望它将“A0”保存到 insouts[x][0]。256 只是我选择的一个数字,因为我不知道它在文本文件中可能有多少输入。

我将 insouts 声明为:

char * insouts[256][2];
4

3 回答 3

0

您想传递数组的第 x 个元素的地址,而不是存储在那里的值。您可以使用 address-of 运算符&来执行此操作。

我认为

 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';
}
于 2013-09-23T23:06:08.970 回答
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]);
于 2013-09-24T00:28:51.827 回答
0

使用fgets()& 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
   }
}
于 2013-09-24T04:46:48.097 回答