【问题标题】:Storing values of file into array leads to weird behaviour将文件的值存储到数组中会导致奇怪的行为
【发布时间】:2015-03-12 14:09:33
【问题描述】:

假设我有文件

5f2
3f6
2f1

代码:(printf 应该打印第二个数字(即 2,6 和 1)但它没有

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int main (int argc, char * argv[])
{
    FILE *ptr;
    char str[100];
    char * token;
    int a, b, i;
    int arr[4];

    if(argc > 1)
    {
        ptr = fopen(argv[1],"r");
        if(ptr == NULL)
        {
            exit(1);
        }
    }

   else
   {
       exit(1);
   }

   //And I'm looking to parse the numbers between the "f" so..

   while(fgets(str,100,ptr) != NULL)
   {
       token = strstr(str,"f");
       if(token != NULL)
       {
           a = atol(str); // first number
           b = atol(token+1); // second number
           arr[i] = b; // store each b value (3 of em) into this array

       }
       i++; 
       printf("Values are %d\n",arr[i]); //should print 2,6 and 1
   }
}

我试图将 printf 移到循环之外,但这似乎打印出更奇怪的结果,我之前看过有关将整数从文件存储到数组中的帖子,但是由于这涉及使用 strstr,所以我我不确定程序是否相同。

【问题讨论】:

  • i++; printf("Values are %d\n",arr[i]); --> i=0;...printf("Values are %d\n",arr[i++]);file --> ptr

标签: c parsing pointers printing


【解决方案1】:
int i,j=0;
while(fgets(str,sizeof(str),file) != NULL)
{
   size_t n = strlen(str);
   if(n>0 && str[n-1] == '\n')
   str[n-1] = '\0';
   i = str[strlen(str)-1] - '0'; /* Convert the character to int */
   printf("%d\n",i);// Or save it to your int array arr[j++] = i;
}

如图所示移动到最后一个字符并将其打印为整数。

PS:fgets() 带有一个换行符,如图所示,您需要抑制它

【讨论】:

  • 如何访问这里的每个元素?
  • @user3739406 正如我所展示的,您可以将值保存在数组中,然后将其打印出来,或者直接打印出值而不将其存储在数组中,这取决于您
【解决方案2】:

你永远不会初始化i,然后你正在读入arr[i](只是发生不会在那里崩溃),然后增加i(到“未定义的值+1” ),然后打印 arr[i] -- 即,您正在写入和读取未初始化的内存。

此外,您的FILE *ptr,而不是file。而且你应该养成使用strtol() 而不是atol() 的习惯,因为前者可以让你正确地检查成功(并从错误中恢复)。

【讨论】:

  • 我已将 i 初始化为零,并用指针修正了错字,但现在输出似乎是巨大的数字。
  • @user3739406:嗯,三分之二。将i++ 放在 printf() 之后(并考虑“为什么”)。 ;-)
猜你喜欢
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 2021-12-08
  • 2016-12-14
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
相关资源
最近更新 更多