c - 字符串被缩短两个字符

标签 c string

我需要获取最大长度为 50 个字符的用户输入字符串。因此我定义了 MAX_STRING_LENGTH变量为 50,字符串初始化为 51 个字符。但是,每次输入大于 48 个字符时,都会从最后两个字符中截取字符串。这是学校练习,我不能使用 <string.h> .

#include <stdio.h>
#define MAX_STRING_LENGTH 50

int main(void) 
{   
    int j=0;

    char stringInput[MAX_STRING_LENGTH+1]; //string initialized.
    printf("Please enter a valid string\n");
    fgets(stringInput,MAX_STRING_LENGTH,stdin); //string input.

    for(j=0;stringInput[j]!='\0';j++);
    if(j<MAX_STRING_LENGTH+1)
    {
        j=j-1;
        stringInput[j]='\0'; //remove newline if it exists
    }  
    //...
    return 0;
}

我不明白为什么字符串会丢失 2 个字符。

我假设使用 \n 时总是创建换行符( fgets ) (即使输入了 50 个字符的完整字符串),并且我总是丢失 1 个字符(因此我必须增加字符串的字符串大小)。但是我不明白另一个角色是如何丢失的。

非常感谢您的反馈。谢谢

最佳答案

在此通话中

fgets(stringInput,MAX_STRING_LENGTH,stdin);

您指定最多将在数组 stringInput 中读取 MAX_STRING_LENGTH - 1 个字符。

如果您希望数组可以包含 50 个字符的字符串(不包括终止零),那么您必须像这样调用 fgets

fgets(stringInput,MAX_STRING_LENGTH + 1,stdin);

但在这种情况下,如果用户恰好输入了 50 个字符,则与输入的 Enter 键对应的新行字符仍将位于输入缓冲区中。要提取它,您应该至少像这样声明数组

char stringInput[MAX_STRING_LENGTH + 2];

并像这样编写调用

fgets(stringInput,MAX_STRING_LENGTH + 2,stdin);

不过,最好一开始就将 MAX_STRING_LENGTH 声明为 52。

关于c - 字符串被缩短两个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40747457/

相关文章:

python - 索引错误: String Index out of range for recursive function

C 全局结构 : "error: expected expression before ' {' token"

c++ - 如何在C++中将字符串转换为整数?

c - 函数和指针

c++ - 对于大于 32,767 的值,强制转换为 "signed int"并返回 "signed short"如何工作?

c - C 中的字符串标记

c - 字符串指针和字符串数组的区别

string - 删除子字符串中所有出现的测试用例

c++ - 在排序数组中找到a [i] = i的最有效方法是什么?

c - C 中的求值顺序(对于带 * 和++ 的表达式)