2017-02-16 62 views
0

「在此任務中鍛鍊,你需要創建libsolution.so其實現與以下原型功能的共享動態庫:一種用於C + Linux的

int stringStat (const char * string, size_t multiplier, int * count); 

該函數返回的字符串值的長度乘以乘數,並增加1的值,表示計數。「

我的代碼:

#include <stdio.h> 

unsigned strln(const char *str) 
{ 
    unsigned int len = 0; 

    while(*str!='\0') 
    { 
      str++; 
      len++; 
    } 

    return len; 
} 

int stringStat(const char *string, int multiplier, int *count) 
{ 
    *count = *count+1; 
    return strln(string)*multiplier; 
} 

int main(void) { 
    printf("%d", stringStat("hello", 2, 2)); 
    return 0; 
} 

錯誤與線18-21:

相似之處@ Debian的GNU Linux的-8:〜/實驗室/ $ lab1中的gcc -o解決方案solution.c -c solution.c:在函數'main'中: solution.c:19:38:warning:通過'stringStat'的參數3傳遞參數3使得整型指針沒有轉換 printf(「%d」,stringStat(「hello 「,2,2)); ^ solution.c:12:5:注:預期 '詮釋*',但參數的類型 'INT' INT stringStat(常量字符*字符串,整數乘數,INT *計數){

誤差不用線路18-21:

我用-c選項,其工作編譯,但是當你嘗試啓動./solution舉報某些原因拒絕「權限」,糾正了文件模式,現在在這裏:

parallels @ debian-gnu-linux-8:〜/ labs/lab1 $ ./solution bash: ./solution:不能執行二進制文件:執行格式錯誤

我在這裏讀了很多的信息,我明白指針和宣稱的問題,但我不知道下一步該怎麼做。 它有點難,請給我一些答案的例子,plz。

+0

你傳入'2'(A值)'stringStat'功能'INT * count' ......這是完全錯誤的。你應該開始學習一些關於pionters的東西 – LPs

+2

你使用了'-c',所以gcc將生成一個對象文件而不是可執行文件。 – Ryan

+0

注意:'strln'返回一個'unsigned' int,而'stringStat'返回一個int。 – LPs

回答

0

我期望stringStat()的返回值爲size_t。但是,正如你所說的任務需要遵守功能原型:

int stringStat (const char * string, size_t multiplier, int * count); 

這就是我們將要使用的。值得注意的是,標準庫函數strlen()的返回類型爲size_t,這是一個unsigned整型保證能夠保存任何數組索引(因此適用於此用途)。我也想將lencount更改爲size_tsize_t *,但我們將保留這些作爲intint *以匹配函數原型。

現在,您所提供的規範說的stringStat()功能的:

該函數返回的字符串值的長度由乘數相乘,在1的值,這表明數增加。

我解釋這意味着該函數的返回值是一個字符串multiplier倍只要輸入字符串的長度。我原本以爲值要被存儲在該地址處count應該是字符數組這是保持這樣的字符串的大小,即,串的相乘長度加上空間用於\0終止子。這不太合理,但保留一個被稱爲stringStat()的次數的計數器也沒有多大意義,所以我會推遲到你的代碼看起來在後一種意義上保留一個計數器。

綜合起來,strln()函數看起來很好,除了在其他情況下,我會推薦使用size_t而不是int這裏。 stringStat()函數看起來不錯。我更改了main()中的代碼以更清楚地瞭解不同變量發生了什麼。特別是,你傳遞的整數常量2作爲第三個參數到stringStat(),這導致了原始錯誤。你需要在這裏傳遞一個指向int的指針。所以我宣佈int變量main_counter,初始化爲零。 main_counter的地址是指向int的指針,並傳遞給該函數。內部的stringStat()功能存儲在由count(存儲在main_counter值)保持的地址的值被返回相乘字符串長度之前遞增。每次調用stringStat()時,main_counter中的值將遞增。

#include <stdio.h> 

int strln(const char *str) 
{ 
    int len = 0; 

    while(*str != '\0') { 
     str++; 
     len++; 
    } 
    return len; 
} 

int stringStat(const char *string, int multiplier, int *count) 
{ 
    int new_len = multiplier * strln(string); 

    *count = *count + 1; 
    return new_len; 
} 

int main(void) 
{ 
    int main_counter = 0; 
    char *str = "hello"; 
    size_t mult = 2; 
    int newstr_len = stringStat(str, mult, &main_counter); 

    printf("Original string: %s --- length: %d\n", 
      str, strln(str)); 
    printf("String length multiplied by %zu\n", mult); 
    printf("New string length: %d\n", newstr_len); 
    printf("Times stringStat() called: %d\n", main_counter); 

    return 0; 
} 

程序輸出:

Original string: hello --- length: 5 
String length multiplied by 2 
New string length: 10 
Times stringStat() called: 1 
1

您傳遞2作爲指針。 2是一個整數,不是指向整數的指針。

將這個:

int k = 2; 
stringStat("hello", 2, &k); 

在上面的代碼,k是其等於2&k是變量k的地址等在stringStat功能,計數指針開始指向k的整數。

+0

David,你能否願意變形? 我需要查看代碼才能看到它。 –