问题:为什么我的长度为20的字符串限制在6个字符?

3

我试图制作自己的str_to_upper函数,但当我输入的内容超过5个字符时,它只返回前5个字符和一个'\0'字符。我猜测word[5]应该是'\0',这意味着我的代码返回了一个长度为6个字符的字符串,但我不明白这个'\0'来自哪里。

我的代码:

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

char *str_to_upper(char *);

int main()
{
    char word[20];

    puts("Please enter a word: ");
    fgets(word, strlen(word), stdin);

    puts(str_to_upper(word));

    return 0;
}

char *str_to_upper(char *sentence)
{
    int length=strlen(sentence);

    for(int i=0; i<length; i++)
    {
        sentence[i]=toupper(sentence[i]);
    }

    return sentence;
}

输出:

Please enter a word: 
aaaaaaaaaaa  
AAAAA

当我在我的数组内放置for循环写入时,我得到了以下结果:
Please enter a word:
aaaaaaaaaaa
AAAAA
AAAAA0��}y

3
您只能在一个有效的以空字符结尾的字符串上使用 strlen 以获取其实际长度。在这里:fgets(word, strlen(word), stdin)word 没有被初始化。fgets 需要填充缓冲区的大小,因此在这里应该使用 sizeof(word),在您的情况下是20。(但您在 str_to_upper 中使用 strlen 是正确的。) - M Oehm
1
附注:int length=strlen(sentence); for(int i=0; i<length; i++) 会将 word 下降两次。替代方案:for(int i=0; word[i]; i++) 或更好的 for(size_t i=0; word[i]; i++) - chux - Reinstate Monica
1个回答

4
只需要替换您的文本即可。
fgets(word, strlen(word), stdin);

使用

fgets(word, sizeof(word), stdin);

实际上,strlen 返回未初始化的字符串 (word) 的长度。因此,fgets 的当前限制是由您的堆栈中有什么导致的。

1
简化版:fgets(word, sizeof word, stdin); - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接