2017-02-23 60 views
-3

這裏是初學程序員。我正在嘗試從用戶那裏獲得一個輸入,將其反轉並顯示結果。出於某種原因,它是打印空白而不是反轉字符串。我知道array[i]有正確的信息,因爲如果我在for (int i=0; i<count; i++)行上使用此循環,它會打印正確的字符。它只是不反向打印。我不在這裏?使用循環在C中反轉字符串

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

int main(void) 
{ 
    printf("Please enter a word: "); 
    char *word = get_string(); 

    int count = strlen(word); 

    char array[count]; 

    for (int i=0; i< count; i++) 
    { 
     array[i] = word[i]; 
    } 

    for (int i=count-1; i==0; i--) 
    { 
     printf("%c ", array[i]); 
    } 
    printf("\n"); 
} 
+3

你的條件是錯誤的。它應該是:'for(int i = count-1; i> = 0; i - )' –

+0

將輸入逐字複製到別的地方有什麼意義呢?爲什麼不直接從它所在的位置打印呢? –

+0

如果你想扭轉字符串,你的第一個for循環必須改變。一個陣列將其他數字倒數 –

回答

1
for (int i=0; i< count; i++) 
{ 
    array[i] = word[i]; 
} 

你走了過來串並複製它,你不扭轉這種局面。

由於您不留下'\0'字符終止符的空間,所以在您的array聲明中還有一個細微的錯誤。將緩衝區作爲C字符串傳遞給printf,而不是逐個字符將具有未定義的行爲。

因此,要解決這兩個特定的錯誤:

char array[count + 1]; 
array[count] = '\0'; 

for (int i = 0; i< count; i++) 
{ 
    array[i] = word[count - i]; 
} 

作爲一個側面說明,它可能沒有多大的意義使用VLA這個小練習,但對於較大的輸入它很可能溢出調用堆棧。謹防。

+0

,你忘了空終止字符(並且緩衝區太短1) –

+0

@ Jean-FrançoisFabre - 是嗎?如果這就是爲什麼你倒票的原因,你真的觸發了快樂 – StoryTeller

+0

@ Jean-FrançoisFabre他沒有使用終止字符,他的緩衝區也不是太短。緩衝區包含已知長度的字符,而不是C風格的字符串。沒有必要分配一個額外的字節。 –

0
// the header where strlen is 
#include <string.h> 

/** 
* \brief reverse the string pointed by str 
**/ 
void reverseString(char* str) { 
    int len = strlen(str); 
    // the pointer for the left and right character 
    char* pl = str; 
    char* pr = str+len-1; 
    // iterate to the middle of the string from left and right (len>>1 == len/2) 
    for(int i = len>>1; i; --i, ++pl, --pr) { 
     // swap the left and right character 
     char l = *pl; 
     *pl = *pr; 
     *pr = l; 
    }; 
}; 

並調用函數:

int main(void) { 
    printf("Please enter a word: "); 
    char *word = get_string(); 

    // Just call the function. Note: the memory is changed, if you want to have the original and the reversed just use a buffer and copy it with srcpy before the call 
    reverseString(word) 
    printf("%s\n", word); 
}; 

而只是改變

char array[count]; 

for (int i=0; i< count; i++) 
{ 
    array[i] = word[i]; 
} 

// add an other byte for the null-terminating character!!! 
char array[count+1]; 
strcpy(array, word); 
+0

代碼沒有任何解釋是不會有所幫助的。您應該在發佈彙編代碼時發佈。 –

+3

好吧,但有很多代碼片段可以做到這一點(按照我的重複鏈接)。 OP想知道_his_代碼中的問題。 –