2

我正在尝试获取此代码以验证用户是否输入了值。如果我使用gets() 它可以工作,但是当我将它更改为fgets() 时它会停止工作。我希望它一直循环,直到用户输入至少 1 个字符但小于 25 个字符的字符串,如果它在我的代码中不明显,我是编程新手。谢谢!

int main(void)
{
    char input[25], inputNew[25];
    int i;
    int x;
    int y;
    do
    {
        printf("Please enter a string less then 25 characters!\n");
        fgets(input, sizeof(input), stdin);  
        y = strlen(input);  
    }
    while(y>25 || y<=0);

    for (i = 0; i <= strlen(input); i++)
    {
        inputNew[i] = toupper(input[i]);
        for (x = 1; x <= strlen(input); x+=2)
        {
        inputNew[x] = tolower(input[x]);
        }
    }
    printf("The new value is: %s.\n", inputNew);
return 0;
}
4

4 回答 4

6

fgets保留结束的换行符,而gets将其丢弃。

因此,y <= 1如果您使用fgets.

于 2012-10-16T04:45:16.723 回答
1

首先,避免gets()任何严肃的代码中。gets()设计不当且不安全。永远不要使用它。

第二。fgets()将换行符保留在缓冲区的末尾(同时gets()丢弃它)。

第三,y <= 0在 的情况下可能是错误的fgets(),因为它可能会读取至少一个字符(换行符)。您应该将其替换为y < 2.

最后也是重要的:请缩进您的代码。:)

于 2012-10-16T04:50:01.770 回答
0

nneonneo 击败了我的答案:

gets() 函数等价于 fgets(),具有无限大小和标准输入流,只是换行符(如果有)不存储在字符串中。

来自http://www.manpagez.com/man/3/fgets/

我只是添加了参考...

于 2012-10-16T04:46:35.117 回答
0

您已使用静态大小声明变量 input 25 。所以我看不到它有可能为 y = strlen(input); 获得更大的尺寸;

改变你的

char input[25];

char input[100];

任何超过 25 的东西。

于 2012-10-16T04:54:26.083 回答