簡體   English   中英

C程序-警告:賦值使指針從整數開始而沒有強制轉換

[英]C Program - warning: assignment makes pointer from integer without a cast

我正在嘗試讀取文件並將其內容存儲在變量中,這是我的代碼:

#define _BSD_SOURCE
#include <stdio.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

// CEK ROUTER MODEL
char* router_model;
char* model() {
    char filename[] = "/tmp/cpuinfo";
    char* key = "system type";
    char* value;
    FILE *file = fopen(filename, "r");

    if (file != NULL) {
        char line[1000];

        while (fgets(line, sizeof line, file) != NULL) /* read a line from a file */ {
            //fprintf(stdout, "%s", line); //print the file contents on stdout.
            if (strncmp(line, key, strlen(key)) == 0) {
                char* value = strchr(line, ':');
                value += 2;
                router_model = strdup(value);
                break;   // once the key has been found we can stop reading
            }
        }
        fclose(file);
    }
    else {
        perror(filename); //print the error message on stderr.
    }
    return router_model;
}

// TULIS SERIAL NUMBER KE FILE
char tulis(char p[100]) {
    // Write a serial number to a file
    char sn[30];
    char encrypt_sn[300];
    printf("Serial Number:\n");
    scanf("%s", sn);
    FILE *f = fopen("/tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c", "w");
    if (f == NULL) {
        printf("Error opening file!\n");
        exit(1);
    }
    fprintf(f,"Serial Number: %s", sn);
    fclose(f);
    sprintf(encrypt_sn, "ccrypt -e /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c -K %s", p);
    system(encrypt_sn);
    system("mv /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c");
    printf("Serial number is saved in /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c\n");
    return 0;
}

// BACA SERIAL NUMBER & SIMPAN DALAM SEBUAH VARIABLE
char baca(char p[100]) {
    // Store the serial number from a file in a variable
    char line[50];
    char decrypt_sn[300];
    char key[30] = "Serial Number";
    char *serial_number;
    if( access( "/tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c", F_OK ) != -1 ) {
        system("cp /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/");
        system("mv /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt");
        sprintf(decrypt_sn, "ccrypt -d /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt -K %s", p);
        system(decrypt_sn);
        FILE *file = fopen("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c", "r");
        if (file == NULL) {
            printf("Error opening file!\n");
            exit(1);
        }
        while (fgets(line, sizeof line, file) != NULL) /* read a line from a file */ {
            //fprintf(stdout, "%s", line); //print the file contents on stdout.
            if (strncmp(line, key, strlen(key)) == 0) {
                char* value = strchr(line, ':');
                value += 2;
                serial_number = strdup(value);
                break;   // once the key has been found we can stop reading
            }
        }
        fclose(file);
        //printf("Your hardware serial number is: (%s)\n", serial_number);
        remove("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c");
    }
    else {
        printf("fsn not found\n");
        return -1;
    }
    return 0;
}

int main(int argc, char* argv[]) {
    char *r;
    char *del;
    char *decrypt;
    int ret;
    char input[30];
    char *p;
    char *original_sn;
    p = "MmI4MTUxM2FjMjRlMDkzYmRkZGQyMjcwMjQ4OWY3MDAwNGZiYTM0MWNkZGIxNTdlYzAxN2";
    //tulis(p);
    original_sn = baca(p);
    printf("SN: %s\n", original_sn);
    return 0;
}

該文件為/tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c ,該文件的內容為Serial Number: 1866203214226041original_sn應該輸出1866203214226041 但是,當我運行該代碼時,我得到:

test.c: In function ‘main’:
test.c:105:14: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
  original_sn = baca(p);
              ^
SN: (null)

我如何解決它 ?

發生這種情況是因為baca函數返回一個char ,而您正在將其返回值分配給char * 也許您想使用一個char變量。

如果函數baca 可以更改輸入參數指向的內存塊的內容:

更改此:

char* p = "MmI4MTUxM2FjMjRlMDkzYmRkZGQyMjcwMjQ4OWY3MDAwNGZiYTM0MWNkZGIxNTdlYzAxN2";

對此:

char p[] = "MmI4MTUxM2FjMjRlMDkzYmRkZGQyMjcwMjQ4OWY3MDAwNGZiYTM0MWNkZGIxNTdlYzAxN2";

如果函數baca 無法更改輸入參數指向的內存塊的內容:

更改此:

char baca(char p[])

對此:

char baca(const char* p)

在baca中,您將使用strdup分配初始化的內存: serial_number = strdup(value); ,那么您什么也不做。 很明顯,您認為該函數返回了指向該內存的指針,因此您可以打印其內容。 但是,這不是您在做什么。 因為您所有的baca函數正在做的事情是返回一個值,該值確定它是否支持(0)(-1)。 而且您正在忽略該指針,而留下了由編分配的一些浪費的未使用內存。 他們是修復您的代碼的2種方法:

方法1:返回序列號

char* baca(const char* p) {
    // Store the serial number from a file in a variable
    char line[50];
    char decrypt_sn[300];
    char key[30] = "Serial Number";
    char *serial_number=NULL;
    if( access( "/tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c", F_OK ) != -1 ) {
        system("cp /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/");
        system("mv /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt");
        sprintf(decrypt_sn, "ccrypt -d /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt -K %s", p);
        system(decrypt_sn);
        FILE *file = fopen("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c", "r");
        if (file == NULL) {
            printf("Error opening file!\n");
            exit(1);
        }
        while (fgets(line, sizeof line, file) != NULL) /* read a line from a file */ {
            //fprintf(stdout, "%s", line); //print the file contents on stdout.
            if (strncmp(line, key, strlen(key)) == 0) {
                char* value = strchr(line, ':');
              if(value!=NULL){/*testing the return value for erros so you prog doesn't cruch*/
                value += 2;
                serial_number = strdup(value);
               }
              /*in case off erreor you can choose one of two options:*/
              /*optinon1: print an error mesage then kill your prog*/
              else{
                printf("Error: corrupted file!\n");
                exit(1);
              } 
              /*option 2: removing the else part your baca then will return NULL and the calling code should understand that an error has occured*/               
                break; 
            }
        }
        fclose(file);
        remove("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c");
    }
    else {
        printf("fsn not found\n");
    }
    return serial_number;
}
int main(int argc, char* argv[]) {
    char *r;
    char *del;
    char *decrypt;
    int ret;
    char input[30];
    char *p;
    char *original_sn;
    p = "MmI4MTUxM2FjMjRlMDkzYmRkZGQyMjcwMjQ4OWY3MDAwNGZiYTM0MWNkZGIxNTdlYzAxN2";
    //tulis(p);
    original_sn = baca(p);
    if(original_sn!=NULL){
      printf("SN: %s\n", original_sn);
      free(original_sn);/*you should free the memory allocated by strdup once you are done using it.*/
    }
    else{
     printf("An error has occured\n");
    }
    return 0;
}

方法2:通過引用傳遞

char baca(const char* p, char **serial_number) {
    // Store the serial number from a file in a variable
    char line[50];
    char decrypt_sn[300];
    char key[30] = "Serial Number";
    char ret = 0;/*the return value 0 means no error.*/
    if( access( "/tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c", F_OK ) != -1 ) {
        system("cp /tmp/halo/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/");
        system("mv /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt");
        sprintf(decrypt_sn, "ccrypt -d /tmp/fsn-55cfc8770b69cc07268fae7f25ee444c.cpt -K %s", p);
        system(decrypt_sn);
        FILE *file = fopen("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c", "r");
        if (file == NULL) {
            printf("Error opening file!\n");
            exit(1);
        }
        while (fgets(line, sizeof line, file) != NULL) /* read a line from a file */ {
            //fprintf(stdout, "%s", line); //print the file contents on stdout.
            if (strncmp(line, key, strlen(key)) == 0) {
                char* value = strchr(line, ':');
                if(value!=NULL){/*testing the return value for erros so you prog doesn't cruch*/
                value += 2;
                *serial_number = strdup(value);
               }
              /*in case off erreor you can choose one of two options:*/

              else{
                 /*optinon1: print an error mesage then kill your prog*/
                 /*option 2: making the return value non 0 and the calling code should understand that an error has occured*/
                #define OPTION1
                #ifdef  OPTION1
                printf("Error: corrupted file!\n");
                exit(1);
                #else
                ret=-2; //to used this option comment out #define OPTION1
                #endif  
              }            
                break; 
            }
        }
        fclose(file);
        remove("/tmp/fsn-55cfc8770b69cc07268fae7f25ee444c");
    }
    else {
        printf("fsn not found\n");
        ret=-1;
    }
    return ret;
}
int main(int argc, char* argv[]) {
    char *r;
    char *del;
    char *decrypt;
    int ret;
    char input[30];
    char *p;
    char *original_sn=NULL;
    p = "MmI4MTUxM2FjMjRlMDkzYmRkZGQyMjcwMjQ4OWY3MDAwNGZiYTM0MWNkZGIxNTdlYzAxN2";
    //tulis(p);
     switch(baca(p,&original_sn))
     {
        case 0: //evrything is fine
           printf("SN: %s\n", original_sn);
           free(original_sn);
           break;
       case -1:/* handle each error as you should*/
       case -2:
       default:
         printf("An error has occured\n");
     }
    return 0;
}

希望這可以幫助。 :)。

暫無
暫無

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

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