我需要获取最大长度为 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/