想請問各位先進:
content是一個欄位,其內容類似產品成分。
今想將其分成兩段列印出來,在編譯過程中出現警告訊息,但其結果是成功的:
warning: passing arg 1 of `strlen' makes pointer from integer without a cast
程式碼如下:
char st1[50], st2[50];
int c1 = 48;
int c2 = c1;
int len_st=strlen(content);
int con1, con2;
substr(st1, content, 0, c1);
con1=word_count(st1);
substr(st1, content, 0, c1+1);
con2=word_count(st1);
if ( con1 == con2)
c2=c1+1;
substr(st1,content,0,c2);
substr(st2,content,c2,len_st);
看過很多類似問題,但還是不懂其問題點。
還請各位先進幫小弟解惑,感激不盡。
看編譯器是哪一種吧,
[1]char content[100];
與
[2]char *content = new char[100];
前者[1]content是一個具體存在的array空間
而後者[2]只是1個指標,指向一個new起來的array空間
strlen的宣告如fysh711426所說的
size_t strlen( const char* str );
接受的[2]指標而不是[1]array
如果函式是這樣宣告的
size_t strlen( const char str[] );
那才會與[1]array相符,
而因為傳入的參數型態與函式宣告的不相符所以被warning
但實際上前兩者運作都能符合人腦認知的需求 XD
至於會不會warning則看編譯器預設(或者是已有被改設)
也有的是程式碼中去disable相關的warning訊息,
畢竟有的人認為重要有的人認為不重要,看習慣啦!
有的人認為寫程式要儘可能嚴謹,
每個步驟都要明確寫清楚是想要那麼作,
有的人認為方便,通常就是這樣想,不用太囉說,自動處理就好了~
其實包括
int len_st=strlen(...)
也有可能被warning, 因為strlen是unsigned int
被assign到int宣告的len_st
例如VS10之後很容易看到
warning C4267: 'argument' : conversion from 'size_t' to 'int', possible loss of data
看到煩了,就在程式裏寫上
#pragma warning(disable:4267)
那樣這個4267的warning就乖乖消失了...
此題中可以設計一個函式如下:
int cArrayLen(char s[])
{
return (int)strlen((const char *)s);
}
那改用
int len_st=cArrayLen(content);
應該就不會被warning了吧~
不過只有一行,也可以改寫成完整(龜毛)版
int len_st=(int)strlen((const char *)content);
試試看那個warning是否就會消失了!