C 绳子被剪短两个字符

C 绳子被剪短两个字符,c,string,C,String,我需要获得一个最大长度为50个字符的用户输入字符串。因此,我将MAX\u STRING\u LENGTH变量定义为50,字符串初始化为51个字符。但是,每次输入大于48个字符时,将从最后两个字符中剪切字符串。这是一个学校练习,我不能使用 #包括 #定义最大字符串长度50 内部主(空) { int j=0; char stringInput[MAX_STRING_LENGTH+1];//字符串已初始化。 printf(“请输入有效字符串\n”); fgets(stringInput,最大字符

我需要获得一个最大长度为50个字符的用户输入字符串。因此,我将
MAX\u STRING\u LENGTH
变量定义为50,字符串初始化为51个字符。但是,每次输入大于48个字符时,将从最后两个字符中剪切字符串。这是一个学校练习,我不能使用

#包括
#定义最大字符串长度50
内部主(空)
{   
int j=0;
char stringInput[MAX_STRING_LENGTH+1];//字符串已初始化。
printf(“请输入有效字符串\n”);
fgets(stringInput,最大字符串长度,标准输入);//字符串输入。
对于(j=0;stringInput[j]!='\0';j++);
如果(j在本次通话中

fgets(stringInput,MAX_STRING_LENGTH,stdin);
您指定在数组
stringInput
中最多读取
MAX\u STRING\u LENGTH-1
个字符

如果希望数组包含50个字符的字符串(不包括终止的零),则必须调用
fgets
like

fgets(stringInput,MAX_STRING_LENGTH + 1,stdin);
但在这种情况下,如果用户恰好输入了50个字符,则与输入的键Enter对应的新行字符仍将在输入缓冲区中。要提取它,您应该声明数组至少与

char stringInput[MAX_STRING_LENGTH + 2];
然后像这样写电话

fgets(stringInput,MAX_STRING_LENGTH + 2,stdin);
不过,最好先声明
MAX\u STRING\u LENGTH
等于52。

这个小循环

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

如果(j这是一个[c]而不是[c++]问题


的文档请仔细阅读
fgets
的文档。它始终存储空终止符,因此它读取的字符数比您传递给它的大小少一个字符,因此您永远无法读取50个字符(因为它只读取49个字符,然后存储空)。您声称要删除换行符“如果存在”但始终要无条件地删除它,即使最后一个字符不是新行,也不要这样做。为什么要手动重新实现strlen?那么,如果输入49个字符,会得到47个?还是46个?如何用51个值初始化50个字符数组(根据问题的第二句话)如果使用了<代码> STD::String 和 <代码>,那么生命将变得简单很多。 GETLeION/COD>函数不存储换行符。为什么这是C++标记?这显然是C代码。
   for(j=0;stringInput[j]!='\0';j++);
    if(j<MAX_STRING_LENGTH+1)
    {
        j=j-1;
        stringInput[j]='\0'; //remove newline if it exists
    }