2016-10-10 3 views
0

const char * const str = ch;にはwarning:initialization makes pointer from integer without a castがあります。初期化はC言語のキャストのない整数からポインタを作成する警告

const char * const str = (char*)chに変更すると、警告はcast to pointer from integer of different sizeになります。

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

int main(int argc, char **argv){ 
    FILE *file1; 
    char ch; 
    char array[100]; 

    file1 = fopen("list.txt","r"); 
    while((ch=fgetc(file1))!=EOF) 
     { 
      const char * const str = (char*)ch; 
      const char * const delim = "\n"; 
      char * const dupstr = strdup(str); 
      char *saveptr = NULL; 
      char *substr = NULL; 
      int count = 0; 
      printf("original string is %s",dupstr); 
      substr = strtok_r(dupstr, delim, &saveptr); 
      do{ 
       printf("#%d filename is %s\n", count++, substr); 
       substr = strtok_r(NULL, delim, &saveptr); 
      } 
      while(substr); 

     free (dupstr); 
     return 0; 
     } 
    fclose(file1); 
    return 0; 
} 
+3

など、fgetsを使用して開かれたファイルからのフルラインを読んで、文字の配列を使うのか? – 4386427

+0

初期化されていないローカル変数 'ch'を持つ' const char * const str =(char *)ch; 'と' const char * const str = ch; 'という式は、未知数とWRONG値(アドレス)をポインタに割り当てます'str' – VolAnd

+1

あなたのコードはchar *でうまく動作します。なぜあなたはconst char * constを使いましたか? – LPs

答えて

2
  • ch=fgetc(file1))!=EOF chがcharあるので間違っているが、EOFintです。これがfgetcなどの関数がintを返す理由です。現在のコードを修正する最も簡単な方法は、おそらく一時的なintを使用し、それをループ内のcharにコピーすることです。

  • const char * const str = (char*)ch;。文字からポインタへのキャストは意味をなさない。これが警告の理由です。 1文字で構成される一時的な文字列を作成する場合は、char str[2] = {ch, '\0'}のようなものを実行する必要があります。そうすれば、strdupのいずれかを使う必要はありません。

1

chchar(一体型)であり、あなたはポインタ型char *(アドレスを格納できるタイプ)に変換してみてください。これらの2つのタイプは非常に異なる性質を持ち、そのようにすることは標準によって禁じられています。少なくともchのアドレスを(char *)&chに変換してください。

charをC文字列として使用しようとすると、コードが保存されないので注意してください。やはりこれらは異なる種類のものです。 charは、文字のコード値を格納するためのものです。 C文字列は、シーケンスで、NUL文字で終了します。

提案(私たちは本当にあなたが達成しようとするのか分からない):プログラムの目的は何

関連する問題