2017-02-21 34 views
-6

我有此函數將字符串更改爲所有小寫字母。使用指針對函數(tolower)進行單元測試

我想爲這個函數創建一個單元測試,但我認爲我傳遞了錯誤的參數,並且出現此錯誤。

Segmentation Fault (core dumped) 

這是我的代碼。

void example (char const * str1, int length, char * str2) { 
    int i; 
    for(i = 0; i < length; i++) { 
     *(str2 + i) = putchar(tolower(*(str1 + i))); 
    } 
} 

void testexample() { 
    char * str1 = "TEST"; 
    char * str2 = ""; 
    example(str1, 4, str2); 
    printf("%s\n", *str2); 
} 

int main() { 
    testexample(); 
    return 0; 
} 

STR1是原始字符串,和n是串的長度,並且是STR2 STR1的所有小寫版本。

我一直在試圖解決這個問題一段時間了。

我很感激任何幫助。謝謝。

+2

這是如何編譯的? – EOF

+0

'str2'指向一個字符串文字,它可能是隻讀的,並且它還不夠長,無法複製'str1'。 – Dmitri

+1

C11標準草案n1570:* 6.5.16賦值運算符約束條件賦值運算符應該有一個可修改的左值作爲它的左操作數*,* 6.3.2.1左值,數組和函數指示符[...]可修改的左值是一個左值 沒有數組類型,沒有不完整的類型,沒有const- 限定類型,[*] *。您的編譯器有義務發佈診斷消息。 – EOF

回答

-1

讓我們一行一行看看你的代碼。

*(str2 + i) = putchar(tolower(*(str1 + i))); 

你似乎什麼是試圖做的是轉換str1爲小寫,結果字符存儲在str2,但是putchar表現在stdout。 你想要做的僅僅是直接設置的值,所以我們改變了行這什麼:

*(str2 + i) = tolower(*(str1 + i)); 

接下來,我們可以使用索引操作a[b](這是語法糖,你在做什麼),以訪問指針整理器的元素,所以讓我們來做。

str2[i] = tolower(str1[i]); 

現在,讓我們看看testexample()函數。

char *str2 = ""; 

這點指針str2爲空字符串常量,這將是你的程序的文本部分。它可能是隻讀的(編輯:如果您嘗試寫入它,則會發生Bad Thing™),對於NULL終止符,此處的數據大小僅爲1個字節。如果您想在此輸出函數的結果,我們需要一個與str1大小相同的可寫內存塊。

char *str2 = malloc(strlen(str1) + 1); 
str2[strlen(str1)] = 0; // Null terminate the string 

我們完成了! (注意:你可能想在之後釋放str2)。

+1

...雖然'putchar()'也返回它打印的字符(作爲一個無符號的'char'轉換爲'int'),所以只要'putchar()'沒有遇到一個錯誤。 – Dmitri

+0

不需要'malloc()',OP甚至不明白字符串是什麼,我不認爲OP知道爲什麼'strlen(str1)+ 1'有一個'+ 1',而且,我認爲字符串文字是隻讀的,因爲標準是這樣說的,所以它不是「*可能*」。 –

+0

@IharobAlAsimi我必須檢查,但我認爲標準只會說他們*可能*是隻讀的...... – Dmitri

0

在你的主:

char * str2 = ""; 

,然後你通過str2作爲參數,但它有太少的存儲和存儲進一步只讀存儲器(點文字)。結果是你的崩潰。使用:

char str2[32] = 0; 

或您需要的任何長度,包括空終止字符。

+1

'char c; c ='a';'我看到分配給角色沒有問題。 – EOF

+0

你甚至沒有理智。 – EOF

+0

@EOF,...呃..我處於指針衝突模式(導致沒有意義:-))。 –

0

你也寫printf("%s", *str2)。如果str2是一個字符串,那麼* str2是一個char。

相關問題