iT邦幫忙

0

'strlen'轉換問題

  • 分享至 

  • xImage

想請問各位先進:

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);

看過很多類似問題,但還是不懂其問題點。
還請各位先進幫小弟解惑,感激不盡。

看更多先前的討論...收起先前的討論...
尼克 iT邦大師 1 級 ‧ 2017-11-15 17:13:38 檢舉
這是那一個程式語法,單單看錯誤是沒有轉型別問題
source code 列了13列
strlen 只有一列有用到
剛剛好就沒列 content 的資料型態...
TO 尼克: Oracle Pro*c
TO 海綿寶寶: 文章中的程式是包在Function裏頭,而宣告是在Function外 char content[100] 不知道這樣是不是造成警告訊息的原因。
size_t strlen( const char* str );
這是函數的宣告,函數的回傳值是 size_t,然後再讓我們看看 size_t,
size_t 在不同平台下大小會不同,但他通常會是個 unsigned int 型態
https://stackoverflow.com/questions/502856/whats-the-difference-between-size-t-and-int-in-c
這個警告的意思呢,就是您將
unsigned int 賦予給 int 但沒有明確的轉型
這時如果 size_t 超過 int 的範圍就會溢位
恩,我知道我回答錯了,不要理我 XD
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
wwx
iT邦好手 1 級 ‧ 2017-11-16 10:05:23

看編譯器是哪一種吧,
[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是否就會消失了!

wwx iT邦好手 1 級 ‧ 2017-11-16 10:18:27 檢舉

補充:
可以看這兩個結果,就可以意會到array和point的不同
{
char cdata[100];
printf("sizeof(cdata)=%u\n", sizeof(cdata));
}

{
char *cdata = new char[100];
printf("sizeof(cdata)=%u\n", sizeof(cdata));
}

前面那個是 100

後者為 4 (x86),
如果是x64的程式將會是 8

原來可以這樣寫,謝謝前輩的幫忙。
當時腦袋卡卡,其實就只是在Function中並未定義CONTENT型態,聲明後就可以正常編譯了。/images/emoticon/emoticon41.gif

我要發表回答

立即登入回答