簡體   English   中英

讀取一個字符串並將其放入C的(int)中

[英]Read a string and get it in (int) in C

你能幫助我嗎? 我有一個字符串23;56;36.6;run在txt文件中23;56;36.6;run 。然后,我正在讀取此字符串,以便將其用於某些工作:我想從字符串中獲取此值,然后將它們與代碼並在控制台中輸出我的結果。 我認為,我應該使用atoi()函數來使我的字符串成為數字,以進行選擇,我正在使用strtok() 但是我應該如何正確地在循環中記錄令牌, while最后一個令牌是一種字符。 我該怎么做?

碼:

void printInfo(int note)
{
    int i;
    FILE *out;
    char str[250];
    char sp[10]=";";
    char *istr;


    if ((out =fopen("test.txt","r"))==NULL)
        printf("Error open, file\n");
    else
    {
        for (i=0;i<note;i++)
        {
            fgets(str,250,out);
            istr=strtok(str,sp);
            while (istr != NULL)
            {
                printf("%d\n",atoi(istr));
                istr=strtok(NULL,sp);
                // I think, I need to create a variable for recording my values.
            }
        }
    }
   fclose(out);
}

我將使用sscanf將字符串轉換為三個浮點數:

#include <stdio.h>  // sscanf
#include <stdlib.h> // EXIT_SUCCESS
#include <string.h> // memset

int main(void) {
    const char *input = "23;56;36.6;run";
    int i;
    float numbers[3]  = {0, 0, 0};
    char buf[10];
    int nElementsRead;

    // init buf
    memset(buf, 0, sizeof(buf));

    // sscanf returns the number of read elements
    // or EOF on error
    nElementsRead = sscanf(input, "%f;%f;%f;%9s", &numbers[0], &numbers[1], &numbers[2], buf);

    if (nElementsRead == 4) {
        printf("Successfully read %d elements\n", nElementsRead);

        for (i = 0; i < 3; ++i) {
            printf("number[%d]: %f\n", i, numbers[i]);
        }

        printf("Buffer is: %s\n", buf);
    } else {
        printf("Something went wrong!");

        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

使用可比較記錄的另一種解決方案:

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

typedef struct MyRecord_s {
   int   f1;
   int   f2;
   float f3;
   char  f4[10];

} MyRecord;

static int MyRecordInit( MyRecord * out, char * line ) {
   if( out == NULL ) {
      return 0;
   }
   char * f1 = strtok( line, ";" );
   char * f2 = strtok( NULL, ";" );
   char * f3 = strtok( NULL, ";" );
   char * f4 = strtok( NULL, ";" );
   if( f1 && f2 && f3 && f4 ) {
      char * err = NULL;
      out->f1 = strtol( f1, &err, 10 );
      if( err && *err ) {
         return 0;
      }
      out->f2 = strtol( f1, &err, 10 );
      if( err && *err ) {
         return 0;
      }
      out->f3 = strtof( f1, &err );
      if( err && *err ) {
         return 0;
      }
      strncpy( out->f4, f4, 10 );
      out->f4[9] = '\0';
      return 1;
   }
   return 0;
}

int MyRecordCmp( const MyRecord * r1, const MyRecord * r2 ) {
   int diff = r1->f1 - r1->f2;
   if( diff ) {
      return diff;
   }
   diff = r1->f2 - r2->f2;
   if( diff ) {
      return diff;
   }
   float d = r1->f3 - r2->f3;
   if( d > 0.000001 ) {
      return +1;
   }
   if( d < -0.000001 ) {
      return -1;
   }
   return strcmp( r1->f4, r2->f4 );
}

int main() {
   char line1[] = "23;56;36.6;run";
   char line2[] = "24;57;37.6;stop";
   MyRecord r1, r2;
   if( MyRecordInit( &r1, line1 ) && MyRecordInit( &r2, line2 )) {
      printf( "cmp: %d\n", MyRecordCmp( &r1, &r2 ));
   }
   return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM