2016-04-09 33 views
0

我發現這個程序用於在線反轉這個程序。C程序中的字符串反轉嗎?

我剛剛開始學習C.

我在這裏無法理解一些東西。

  1. 爲什麼而結束於;
  2. while(str[++i]!='\0');是什麼意思?
  3. rev[j++] = str[--i];與寫j ++相同;和我 - ;在while循環中?

這是程序:

#include<stdio.h> 
int main(){ 
    char str[50]; 
    char rev[50]; 
    int i=-1,j=0; 

    printf("Enter any string : "); 
    scanf("%s",str); 

    while(str[++i]!='\0'); 

    while(i>=0) 
    rev[j++] = str[--i]; 

    rev[j]='\0'; 

    printf("Reverse of string is : %s",rev); 

    return 0; 
} 
+0

也許這個問題將清除「++ i」和「i ++」約定:http://stackoverflow.com/questions/24853/what-is-the-difference-between-i-and-i – user161778

+0

- 我的意思是我在整個表達完成之前減少,i--意味着在整個表達完成後我減少。 – totoro

+0

請始終使用大括號。它可以在未來節省一個可能的錯誤。 –

回答

3
while(str[++i]!='\0'); 

相當於

while(str[++i]!='\0') 
     /*do nothing*/; 

這相當於

++i; 
    while (str[i]!='\0') { 
     ++i; 
    } 

while(i>=0) 
     rev[j++] = str[--i]; 

相當於

while (i>=0) { 
     --i; 
     rev[j] = str[i]; 
     ++j; 
    } 

注意i的語句之前,因爲--i遞減是預減,而j在會後聲明,因爲j++增加是後遞增。

+0

Thankyou soo :) 它幫助瞭解了很多程序。 –

+0

你能告訴我爲什麼我的值在while循環之前遞增,在這裏? '++ i; (str [i]!='\ 0') ++ i; } –

+1

@ShamshSameedAhsan:爲了在第一次迭代中預先遞增'i',它需要在循環之前遞增。 –

1
  1. ;是存在於關閉循環
    2:while(str[++i]!='\0');裝置「去STR的throuch每個炭直到達到\0炭」。 \0是一個字符串
    3的結束字符:是
0

首先,while(str[++i]!='\0'); i遞增,直到找到最後一個字符。在C中,所有字符串都以\ 0或NULL結尾(兩者都相同)。

第二個,沒有。它與i++不一樣--i

檢查下列一小段代碼片段:

int a,b,x=10,y=10; 

a = x--; 
b = --y; 

在執行結束時,A = 10,但B = 9。這是因爲--y是預減量。它首先遞減該值,然後將其值賦給b。

1

我會盡力回答我的問題...

  1. 爲什麼而結束於;

這是有效的語法,它經常被用來使程序在該行要等到一定的標誌在嵌入式場景設置。在這種情況下,它用於查找字符串的長度。 所有字符串都以空字符結尾,即'\ 0',並且i上的預增量表示在該行之後,我將保存字符串長度的值。 同等切實把這樣的:

/* If the ith position of the string is not the end */ 
while (str[i] != '\0') { 
    /* Increment i and repeat */ 
    i = i + 1; 
} 

的主要概念這裏是後置和前增量運營商之間的差異 - 可能是值得的,閱讀起來。

  1. while(str [++ i]!='\ 0')是什麼?意思?

請參閱上文。

3.Is rev [j ++] = str [ - i];和寫j ++一樣;和我 - ;在while循環中?

如果你問如果它在while循環,其完全equivelant到:

while(i>=0) { rev[j++] = str[i--]; }

由於只有在while循環不需要括號單操作。 只是一個說明,這是完全主觀的,但我已經討論過的大多數編碼標準甚至在這種情況下使用括號。

您的問題似乎主要與C的語法有關 - 可能值得一本書或看一些教程來熟悉它。

0

下面是程序的註釋版本:

// Include standard input output functions 
#include<stdio.h> 
// declares the main function. It accept an undefined number 
// of parameters but it does not handles them, and returns an integer 
int main(){ 
    // declares tho arrays of 50 characters initialized with random values 
    char str[50]; 
    char rev[50]; 
    // declare and initialize two integer variables 
    int i=-1,j=0; 

    printf("Enter any string : "); 
    scanf("%s",str); 

    // executes the ';' instruction while the condition is satisfied. 
    // ';' is an empty statement. Thus do nothing. 
    // The only action executes here, is the increment of the i variable with 
    // a preincrement. Because the i variable was initialized with 
    // -1, the first control start checking if str[0] != '\0' 
    // If the post increment operator was used, the variable must 
    // have been initialized with 0 to have the same behaviour. 
    while(str[++i]!='\0'); 

    // at the end of the previous while, the i variable holds the 
    // str lenght + 1 (including the '\0') 

    // starting from the end (excluding the '\0', using the pre-decrement on the i variable) 
    // assign to rev[j] the variable of str[i], then (post increment) 
    // increment the j variable 
    while(i>=0) 
    rev[j++] = str[--i]; 

    // now j is equals to str lenth +1 
    // therefore in this position add the null byte 
    rev[j]='\0'; 

    // print result 
    printf("Reverse of string is : %s",rev); 

    // return 0 to the OS 
    return 0; 
} 
0
  1. ;意味着在C語句結束。

    while(condition) 
    { 
        //do something 
    } 
    

    做些事情意味着至少應該執行一條語句。爲此,在這裏使用;

  2. while(str[++i]!='\0');'\0'代表字符串的結尾。這裏循環終止在字符串的末尾並且++i增加i

  3. is rev [j ++] = str [ - i];和寫j ++一樣;和我 - ;在while循環中?
    是的。但隨着--i增加i執行執行rev[j++] = str[--i]rev[j++] = str[--i]所以i--前應rev[j] = str[i]j++增加j之前,所以j++後應rev[j] = str[i]

0

這裏的關鍵是理解行爲前綴之間(++i)的差異,後綴(i--)運營商。

前綴運算符將增加其操作數(i),然後求值爲新值。

後綴操作符將評估其操作數的當前值,然後遞增操作數。

至於:

int i = -1; 

while (str[++i] != '\0'); 

這是一個沒有塊一個循環,因爲所有的報表都可以在有條件的表達。在每次迭代中:

  • 遞增i一個。
  • 獲取char的位置i評估爲。
  • continue如果它不是NUL字符。

這可能在書面得到更好的理解:

int i = -1; 

do { 
    i++; 
} while (str[i] != '\0'); 

這種操作的結果是,i現在擁有的字符串中的NULL字符的位置,因爲所有有效的字符串必須以結束NUL角色。

在節目的下一個部分,前綴操作符再次使用立即獲得字符一個位置前的空字符,然後在此之前一個位置,依此類推,直到我們得到的第一個字符字符串,然後我們完成了。

while(i>=0) 
    rev[j++] = str[--i]; 
0
  1. 爲什麼而結束:

    而(STR [++ I] = '\ 0'!)

一旦str是它與結尾的字符串ASCIIZ '\ 0'字符。所以,儘管只要到達字符串的末尾就會結束。

  • 上述裝置的行:
  • => ++ I:得到對應的字符之前遞增字符串索引。

    =>檢查如果str [指數]!=「\ 0」 //所述字符串的結束達到

    論的,而變量i將包含字符串長度(不包括「\ 0」字符結束)。

    這將是更容易使用的:

    i = strlen(str); 
    
  • 是REV [J ++] = STR [ - I];和寫j ++一樣;和我 - ;在while循環中?
  • 這條線是一樣的:

    while(i>=0) 
    { 
        i = i - 1; 
        rev[j] = str[i]; 
        j = j + 1; 
    } 
    

    --I:遞減後我獲取串字符。 如果您更改爲i--代碼會在減少i之前獲得str [i],但這不是您想要的。