在const char * const str = ch;
上有warning:initialization makes pointer from integer without a cast
。
如果我将其更改为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;
}
答案 0 :(得分:2)
ch=fgetc(file1))!=EOF
不正确,因为ch是char
,但EOF
是int
。这就是fgetc
和类似函数返回int
的原因。修复当前代码的最简单方法可能是使用临时int
,然后将其复制到循环内的char
。
const char * const str = (char*)ch;
。从角色到指针的转换没有任何意义。这就是警告的原因。如果要创建由一个字符组成的临时字符串,则应执行char str[2] = {ch, '\0'}
之类的操作。这样你也不必使用strdup
。
答案 1 :(得分:1)
ch
是char
(整数类型),您尝试将其转换为指针类型char *
(可以存储地址的类型)。这两种类型的性质非常不同,标准禁止这样做。至少转换ch
:(char *)&ch
。
请注意,当您尝试将char
用作C字符串时,这不会保存您的代码。这些都是不同的类型。 char
只是让您存储角色代码值的东西。 C字符串是由NUL字符终止的序列字符。
建议(我们实际上并不知道您尝试实现的目标):使用一组字符,使用fgets
从打开的文件中读取一整行等。