2017-02-25 72 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