2015-09-29 183 views
0
char *str[]={"we", "will", "teach", "you"}; 
int count=0;i,len,m; 

sizeof(str)應返回值18,而它在代碼塊中返回值32。 如果它正確返回字符串的長度,向前移動,因爲知道這個字符數組存儲在連續內存位置的事實,我們可以計算在遍歷我們的數組時出現「\ 0」的次數。如何返回最後一個字符串的索引或最後一個字符串的基地址?

而這個值會給我們最後一個字符串的索引。 我嘗試以下方式:

int len=sizeof(str); 

m=str[0]; //assign the base address of 1st string 
for(i=0;i<len;i++) 
{ 
    if(*(m+i)=="\0") //compare the value at memory location with null 
    count++; 
} 
printf("%d", count); 

如果有人能爲我提供一個洞察我的做法是否正確,或一些其他的解決辦法。 基本上,當數組中的字符串數不能被計算時,基本上要查找最後一個字符串的索引或存在的字符串的數量。

+2

首先,在我讀你的問題之前:這是關於** C還是C++ **? – sidyll

+1

請不要假設多個字符串存儲在連續的內存位置。 – wimh

+0

請說明你正在努力完成什麼。 – QuestionC

回答

1

我沒有看到任何東西,直接回答了這個問題:「我們怎樣才能返回最後一個字符串的索引」所以......

鑑於你的榜樣,你只需要簡單的使用方法:

int strCount = sizeof(str)/sizeof(char*); 
char* lastString = str[strCount-1]; 

您不能將每個字符串走到最後,因爲它們可能不是連續的。您必須使用sizeof直接找到數組的最後一個索引。以前的字符串的內容或位置將無濟於事。

sizeof(str)返回32的原因是因爲您可能正在編譯一個64位應用程序,它使得每個char *佔用8個字節。四個字符串* 8個字節= 32個字節。

2

char * str [] = {「we」,「will」,「teach」,「you」};

這意味着str是一個char類型的指針數組。

所以,str [0]指向我們,str [1]指向will等等。

str不指向一個連續的字符串。

因此,str [3]將指向最後一個字符串「you」。

1

知道該字符數組存儲在連續的內存位置

你不能真正做到這一點的事實。考慮這個顯示字符串內存佈局的代碼。

#include <stdio.h> 

char * spoiler = "you"; 

char * str[] = {"we", "will", "teach", "you"}; 

int main (void) 
{ 
    int i; 
    for (i = 0; i < 4; ++i) 
    { 
     printf ("%p, %i, %s\n", str[i], str[i] - str[0], str[i]); 
    } 

    return 0; 
} 

輸出:

10b80, 0, we 
10b88, 8, will 
10b90, 16, teach 
10b78, -8, you 

字符串是不連續的,他們被提上8個字節的存儲器的邊界。而且他們甚至沒有正確的順序。

計算機對內存中字符串的相對位置沒有任何承諾,甚至有可能不同字符串使用重疊內存。

4
char *str[]={"we", "will", "teach", "you"}; 
int count=0;i,len,m; 

sizeof(str)返回值18,而它在 碼塊返回一個值32。

如果你的編譯器行爲正確,18是不可能的。這是因爲sizeof的結果與所有字符串的總長度無關。它返回與實現相關的char*的大小乘以數組中元素的數量。並且18不能被4除。

嘗試一些不易混淆的東西,例如short arr[] = { 1, 2, 3, 4, 5 };。它在我的機器上返回10,因爲我的機器上的sizeof(short)是2,數組有5個元素,而2 * 5 = 10

知道這字符數組存儲在連續 存儲器位置

它不能保證這樣的事實將被存儲這樣。事實上並非如此。單個字符串文字處於連續內存中,並且指向這些文字的指針也是連續的。就這樣。換句話說,你很可能有這樣的情況:

   +-----------------+ 
      |     | 
      v     | 
"we\0"  "teach\0" "will\0" | "you\0" 
^    ^  | ^
    |     |  | | 
    |   +---------+  | | 
    |   |     | | 
    |   |  +---------+ | 
    |   |  |    | 
    |   |  |  +-----+ 
    |   |  |  |  
Pointer1|Pointer2|Pointer3|Pointer4 

如果有人能爲我提供一個洞察我的做法是正確的

你的方法調用不確定的行爲。由於len大於str[0]的長度,因此您嘗試在str[0]的終止\0後訪問內存。您還與"\0"而不是'\0'比較,這是沒有意義的,因爲字符串文字"\0"尚處於內存中的另一個未指定位置。

你的方法還有一些其他的細節錯誤,但由於它是基於一個錯誤的前提,所以你可以做很多事情來保存它。

或其他一些解決方案。

如果問題真的是「我們如何返回最後一個字符串的索引或最後一個字符串的基地址?」,那麼只需單獨記住陣列的大小,並做size - 1。如果您實際使用C++,只需使用std::arraystd::vector

+1

哇。你真的花時間爲它製作ascii藝術。 – QuestionC

-1

該死的,用C/C++編程已經很久了。

--- 注意下面的代碼中有「警告」尤其是致命的2個項目通過今天的標準 -

我無法修復它們,因爲我在那些concepts.I有點生疏會必須經過他們。無論如何,如果你一直在玩C/C++一段時間,你應該能夠修復它們。

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


int main() 
{ 
    char *str[]={"we", "will", "teach", "you"}; 
    char **ptr; 
    int i,baseAddr,index; 
    ptr=&str; 

    baseAddr=(*ptr+0); 
    for(i=0;i<4;i++) 
    { 
    //printf("%u\n",str[i]); 
     baseAddr=baseAddr+strlen(str[i])+1; 
     if(i==3) 
     { 
     index=i; 
     } 
    } 

    printf("Last Element Address:%d",baseAddr-strlen(str[index])-1); 


    return 0; 
} 

//C++? 
#include<iostream> 
#include<cstring> 
using namespace std; 


int main() 
{ 
    char *str[]={"we", "will", "teach", "you"}; 
    char **ptr; 
    int i,baseAddr,index; 
    ptr=str; 

    baseAddr=(int)(*ptr+0); 
    for(i=0;i<4;i++) 
    { 
    cout<<&str[i]<<endl; 
    baseAddr=baseAddr+strlen(str[i])+1; 
    if(i==3) 
    { 
    index=i; 
    } 
    } 

    cout<<"Last Element Address:"<<(ptr+index); 

    return 0; 
} 
+0

這甚至不編譯(至少在C++中,不知道C)。如果你只是猜測,你爲什麼會發布答案?而你甚至不解釋你試圖達到什麼...... –

+0

這是一個C唯一的代碼。哈哈,你爲什麼使用C++編譯器? – Mutex202

+0

問題是(也)標籤爲C++。 –

相關問題