2013-02-19 69 views
0

我想創建我自己的字符串函數,我似乎被卡在這一點。以下是我迄今爲止製作一個字符串並打印並返回大小的內容。但我需要做一個函數,該函數將指針傳遞給一個字符串以及一個char,並返回該字符串中該char的出現次數。我試圖從這個函數調用函數make_string,但不能讓它工作。 .h文件只有預先列出的功能。任何幫助,這將不勝感激。謝謝!如何在C中創建自己的字符串函數?

#include "readLineUtilities.h" 

int make_string(char **line) 
{ 
char *a,b; 
int i,size=0; 
a = (char *) malloc(sizeof(char)); 
b = getchar(); 
while(b != '\n' && size < MAX) 
{  
    *(a+size) = b; //remember at this point size = 0 
    size++; 
    b = getchar(); 
    a = realloc(a,size+1); 
} 
*(a+size) = '\0'; //end of string marker so no need to return the size directly 
*line = a; 
return size;  

} 

int char_in_string (char *line, char c) { 

make_string(*line); 

} 

void print_string(char *line, int size){ 
char *a; 
int i; 
a = line; 
for (i=0;i<size;i++) 
    printf("%c",*(a+i)); //no end of line 
printf("\n"); 
} 


int length_string(char *line){ 
int size = 0; 
char *c,b; 
c = line; 
if (c == NULL){ 
    printf("line is null\n"); 
    return size; 
} 
while (*(c + size) != '\0'){ 
    size++; 
} 
return size; 
} 
+0

你能解釋一下爲什麼你試圖這樣做嗎?它不能避免使用內置的字符串函數,因爲你使用'printf()'和'getchar()'。它不可能是性能,因爲的realloc的'數()'叫你'make_string使()'是荒謬的。那麼你想要做什麼? – 2013-02-19 03:06:53

回答

1

通過查看該代碼給出錯誤的收集,很容易形成的原因是預計使用該代碼的程序可能無法正常工作。

a = (char *) malloc(sizeof(char)); //的sizeof(char)的是總是 1,因爲的sizeof(型)告訴你有多少個字符的類型。 malloc返回哪種類型?沒有必要將void *轉換爲char *,因爲該轉換由C隱式提供:a = malloc(1);如果在執行投影時錯誤消失,則會丟失malloc/realloc函數所需的#include <stdlib.h>

b = getchar(); // getchar返回哪種類型? b的類型是什麼?這些類型應該是相同的,但在你的例子中它們不是。 getchar返回一個int,這將成爲一個無符號的char值。失敗後,getchar將返回一個負值,與任何可能的成功值不同。我建議將getchar()的返回值存儲到一個int中,並在繼續之前驗證它是否爲正數。否則,當getchar()返回與'\ n'值不同的錯誤時,您的程序可能會掛起並且資源不足。

a = realloc(a,size+1); //如果realloc返回NULL會發生什麼?你的程序泄漏了舊的分配。我建議將返回值分配給char *temp,並在覆蓋a之前檢查成功。如果你不修復這個問題,你的程序可能偶爾會出現段錯誤。

int char_in_string (char *line, char c) { make_string(*line); } //您的return聲明在哪裏? make_string預計爲char **,但表達式*line的計算結果爲char。線路的類型是什麼?那麼&行呢?這在使用時肯定會導致段錯誤。

我相信你在字符串的結束make_string確定,其中字符串結尾的目的,放置一個「\ 0」。我建議在print_string實現中停止'\ 0'。如果您嘗試使用未初始化的值,則會調用未定義的行爲,並且程序可能會崩潰。

1

像下面這樣的東西可以工作。

int char_in_string (char *line, char c) { 

    int len = make_string(&line); 
    int i, cnt = 0; 
    for (i = 0; i < len; ++i) 
    { 
     if (line[i] == c) ++cnt; 
    } 
    return cnt; 

} 
相關問題