2016-06-28 29 views
0

我對C來說比較新。我想通過解決coderbyte challenges來解釋語言。簡單的字符串反向算法出乎意料的結果

但是我在第一次被卡住了。它應該是一個簡單的字符串反向算法。

當我輸入諸如「asdf」或「1234567」之類的東西時,輸出是正確的(「fdsa」,「7654321」)。但是當我輸入「12345678」或「thisiscool」時,我得到了「87654321」@「/」loocsisiht @「。我不知道@來自哪裏。

這是我的代碼:

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

void FirstReverse(char str[]) { 

    int len = strlen(str); 
    char nstr[len]; 
    int i; 

    for(i = 0; i < len; i++) { 
     nstr[i] = *(str+len-1-i); 
    } 

    printf("%s\n", nstr); 

} 
int main(void) { 

    char str[100]; 

    FirstReverse(gets(str)); 
    return 0; 

} 

是否有人可以告訴我在哪裏可以找到錯誤? 在此先感謝:)

+3

'strlen'返回沒有* nul終止的長度*,所以'nstr'太小。你也不要指定nul終止。 – user694733

回答

0

正如其他答案所提到的,你錯過了一個終結者。 還應該指出,按照你的方式分配字符串是一種不好的做法。如果以這種方式創建數組,則數組應始終具有固定大小。

而應該做的:

char * nstr = malloc(sizeof(char) * (len+1)); 

從而分配每個字符(1個字節)倍lenght的大小。 請注意+1,因爲您需要字符串終結符的空間。

當你調用printf(,string); ,它將從第一個字母開始,並將所有內容打印到終止符。由於您在此處沒有終結符,因此它會打印隨機字符,例如@。

你怎麼會想做些什麼來解決這個問題,是增加:

nstr[i] = '\0'; 

你的循環之後。

還記得釋放分配的內存。

0

你忘了在nstr []中爲終止'\ 0'分配一個字符。

所以,更好的利用:char nstr[len + 1];並設置nstr[len] = 0;

此外:gets()是邪惡的:從glibc的手冊頁:

不要使用gets()函數。因爲事先不知道數據是不可能知道get()將讀取多少個字符的,並且因爲gets()會繼續存儲超過緩衝區末尾的字符,所以使用它非常危險。它已被用來破壞計算機安全。使用fgets()代替。

1

在C中,字符串是零終止的。例如,一個字符串「cat」有4個字符,表示爲('c','a','t',(char)0)。你忘了最終0

注意strlen返回沒有最終0字符串長度,所以字符串foo包含strlen(foo)+1字符。記住這一點,當你分配字符串。