2017-02-10 74 views
0

您能幫我嗎?我在一個txt文件中有一個字符串23;56;36.6;run。然後,我正在讀這個字符串以便用於一些工作:我想從一個字符串中獲取這個值,然後將它們與代碼中的某些值進行比較,並將結果輸出安慰。我認爲,我應該使用atoi()功能,使我的字符串在數字中挑選出來,我使用strtok()。但是,我應該如何正確記錄循環中的令牌while,最後一個令牌是一種字符型。我該如何做這項工作?讀取一個字符串並將其存入(int)中C

CODE:

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); 
} 
+0

您可以將字符串轉換以'sscanf'整數(或浮點數)。 – d3L

+0

我會說最簡單的解決方案就是:'sscanf(「23; 56; 36.6; run」,「%f;%f;%f;」,&n [0],&n [1],&n[2]);' – d3L

回答

1

我會用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; 
} 
+0

謝謝,但是它應該如何與'char'一起使用最後一個令牌? –

+0

你也可以用'sscanf'來讀取字符:'sscanf(input,「%10s」,buf);''''表示你想掃描一個最大的字符串10個字符長 – d3L

+0

我更新了我的答案,以考慮到這一點。 – d3L

0

另一種解決方案,採用可比記錄:

#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; 
} 
相關問題