2016-01-28 67 views
0

我需要創建一個返回字符串的函數。到目前爲止,我已經拿出了這樣的代碼:創建函數來反轉字符串的問題

#include <stdio.h> 
#include <string.h> 
#define SIZE 256 

void str_reverse(char[SIZE], char[SIZE]); 

int main(void) 
{ 
    char input[SIZE]; 
    char output[SIZE]; 


    printf("Please enter a string\n"); 
    fgets(input, SIZE, stdin); 

    str_reverse(input, output); 

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


    return 0; 
} 

void str_reverse(char in[SIZE], char out[SIZE]) 
{ 

    int i = strlen(in); 
    int k = 0; 

    for(int j = i; j>= 0; j--) 
    { 
     out[k] = in[j]; 
     k++; 
    } 


} 

但是,每當我嘗試運行代碼,我都沒有得到輸出。有誰知道什麼可能是錯的

回答

0

問題是這樣的線

int i = strlen(in); 

更改它

int i = strlen(in)-1; 

strlen()返回字符串的大小,因此當您從0123開始複製時,in[j]將是\0。這是存儲在out[0]


你需要做的另一個變化是把\0out[],只是for

for(int j = i; j>= 0; j--) 
{ 
    out[k] = in[j]; 
    k++; 
} 
out[k] = '\0';  
+0

這工作!謝謝你的幫助:) –

+0

@EllaLautier,不客氣。 :) – Haris

0

你的「反轉」也包括空字符。所以反轉字符串的第一個字符是'\0'。所以字符串是空的。

變化:

for(int j = i ; j>= 0; j--) 

for(int j = i - 1; j>= 0; j--) 

你也應該檢查字符串長度之前的for循環爲零。否則,i-1將變爲SIZE_MAX,您將遇到問題!

一個簡單的條件,例如在str_reverse()下面將處理這種情況:

size_t i = strlen(in); 
    int k = 0; 

    if (i<=1) return; //empty string or contains only 1 char char. 
0

istrlen(in), so the first character you copy over tois the null byte at the end of the string. Every other character then appears after the null terminator, so out`爲空字符串開出。

開始istrlen(in) - 1,然後加空終止和循環的結尾:

int i = strlen(in) - 1; // start at the last non-null character 
int k = 0; 

for(int j = i; j>= 0; j--) 
{ 
    out[k] = in[j]; 
    k++; 
} 
out[k] = '\0'; // add the null terminator 
0

k0ji,請執行以下操作:

out[0] = '\0'; 

因此,out在函數返回時看起來像一個空字符串。

用途:

for(int j = i-1; j>= 0; j--) 
{ 
    out[k] = in[j]; 
    k++; 
} 

out[k] = '\0'; 
0

在函數變量i被設定在循環中通過以下方式

int i = strlen(in); 

for(int j = i; j>= 0; j--) 
{ 
    out[k] = in[j]; 
    k++; 
} 

然後j等於i然後in[j]是等於終點零字符'\0',字符串爲in。因此,數組out從零開始,即它將包含空字符串。

這是更好地聲明函數本身通過以下方式

char * str_reverse(char *out, const char *in); 

,並從函數指針out返回。在這種情況下,你可以寫例如

puts(str_reverse(output, input)); 

考慮到acount該功能fgets通常也存儲在字符串中的新行字符。你應該刪除它。你可以做到這一點通過以下方式

input[strcspn(input, "\n")] = '\0'; 

而且代替int類型在此聲明

int i = strlen(in); 

最好是使用類型size_t

size_t i = strlen(in); 

它是函數strlen的返回值的類型。但在這種情況下,你也應該正確地編寫循環。:)