2017-02-25 52 views
0

我創建了一個接受char指針的函數。我首先從fgets獲取字符串值,我輸入的輸入是「rwx」。當我輸入該值時,strlen表示它的長度是2,當我查看char數組的第一個索引時,它會返回rw而不是r。我可以問一下我在迭代字符串時會出錯嗎?fgets()讀取的字符數比預期的少

我已經試過:

int main() 
{ 
    char access[3]; 

    while (ValidateAccess(access)) 
    { 
     printf("Please enter your access\n"); 
     fgets (access, 3, stdin); 
    } 
    return 0; 
} 

int ValidateAccess(char * access) 
{ 
    int length = strlen(access); 
    int r = 0,w = 0,x = 0,i; 

    printf("this is the length %d\n", length); 

    if (length == 0) 
     return 1; 

    for(i = 0; i < length; i++) 
    { 
     printf("this is the character: %s", &access[i]); 

     if (strcmp(&access[i], "r") == 0) 
      r++; 
     else if (strcmp(&access[i], "w") == 0) 
      w++; 
     else if (strcmp(&access[i], "x") == 0) 
      x++; 
    } 

    if (r <=1 && w <= 1 && x <= 1) 
     return 0; 
    else 
     return 1; 
} 

當程序運行,這是輸出

"this is the length 0" 
Please enter your access 
rwx 
this is the length 2 
this is the character: rw 
+0

最後一個字符是'\ 0'。 – Shravan40

回答

2

man fgets是一個非常有用的閱讀。讓我引用:「fgets()最多讀入一個小於流的大小字符...」

C中的字符串預計將以\0(零字節)終止。當您將access定義爲3個元素的數組時,它有一個長度爲2的字符串的空間 - 兩個字符加上終止零字節。當您致電fgets說您有3個字節的空間時,它會讀取兩個字符,將它們放在前兩個字節中,並將第三個字節中的零終止。

定義access a有4個字節,並且通過4到fgets

此外,要打印不是焦炭,所以它打印一切終止零字節(這就是rw你看到來自)。如果要打印單個字符,請在格式字符串中使用%c,而不是%s(並且應該傳遞一個字符,而不是指針)。

請嘗試以下程序並確保您瞭解輸出。

#include <stdio.h> 

int main() { 
     char *foo = "barbaz"; 

     printf("%c\n", foo[2]); 
     printf("%s\n", foo + 2); 
} 
+0

嗨@avysk我剛剛嘗試過,長度現在可以達到三個,當我改變訪問長度爲4和fgets得到4.但現在索引0我得到的輸出是rwx,索引1我得到wx,索引2我得到x。它應該是然後w然後x。 – Master

+0

@Master由於您正在打印**字符串**而不是字符('%s'意味着字符串) - 它會打印從給定字符到結束零字節的所有內容。如果要打印單個字符,則需要使用'%c'而不是'%s'。 – avysk

+0

@Master我已更新回答,包括有關打印的信息。 – avysk