C 为什么下面的代码会给出垃圾值?

C 为什么下面的代码会给出垃圾值?,c,string,C,String,为什么下面的代码给出垃圾值? 在这里,我试图从用户一个字符一个字符地获取一个字符串作为输入。在下面的代码中,我从用户那里获得了输入并存储在string[]数组中,然后为了执行一些其他操作,我将相同的内容存储在另一个名为temp_string[i]的数组中。但令人惊讶的是,我在输出中得到了垃圾值。而且使用strlen计算的长度也不正确。有人能看看这段代码并解释出哪里出了问题吗 #include<stdio.h> #include<stdio.h> int main()

为什么下面的代码给出垃圾值? 在这里,我试图从用户一个字符一个字符地获取一个字符串作为输入。在下面的代码中,我从用户那里获得了输入并存储在string[]数组中,然后为了执行一些其他操作,我将相同的内容存储在另一个名为temp_string[i]的数组中。但令人惊讶的是,我在输出中得到了垃圾值。而且使用strlen计算的长度也不正确。有人能看看这段代码并解释出哪里出了问题吗

#include<stdio.h>
#include<stdio.h>

int main()    
{
    char ch;
    int i = 0, j = 0;
    int length = 0;
    int lengthsb = 0;
    char string[100];

    printf(" Enter the string to divide\n "); 
    while(ch != '\n')
    {
        ch = getchar();
        string[i] = ch;
        i++;
    }
    char temp_string[i];
    printf("%s", string);
    i = 0;
    while(string[i] != '\n')
    {
        temp_string[i] = string[i];
        i++;
    }

    length = strlen(temp_string);
    printf("Entered string is  %s and its length is %d\n", temp_string, length);
}
#包括
#包括
int main()
{
char ch;
int i=0,j=0;
整数长度=0;
int lengthsb=0;
字符串[100];
printf(“输入要分割的字符串\n”);
而(ch!='\n')
{
ch=getchar();
字符串[i]=ch;
i++;
}
字符临时字符串[i];
printf(“%s”,字符串);
i=0;
while(字符串[i]!='\n')
{
临时字符串[i]=字符串[i];
i++;
}
长度=strlen(临时字符串);
printf(“输入的字符串为%s,长度为%d\n”,临时字符串,长度);
}

您需要在字符串末尾添加一个以NULL结尾的字符。添加
\0

您需要在字符串末尾添加一个以NULL结尾的字符。添加
\0

您忘记在字符串末尾添加空值。 C字符串以null结尾,这意味着C字符串中的所有操作都希望以null标记字符串的结尾,包括strlen之类的函数

您只需添加以下内容即可实现:

string[i] = '\0';
在填充字符串之后


另外,如果用户输入的字符串大于100,会发生什么情况?验证这些情况下的输入很好,否则会导致缓冲区溢出。

您忘记在字符串末尾添加null。 C字符串以null结尾,这意味着C字符串中的所有操作都希望以null标记字符串的结尾,包括strlen之类的函数

您只需添加以下内容即可实现:

string[i] = '\0';
在填充字符串之后


另外,如果用户输入的字符串大于100,会发生什么情况?验证这些情况下的输入很好,否则会导致缓冲区溢出。

您需要在字符串末尾添加一个
'\0'
字符,以便
strlen()
printf()
和其他处理字符串的C函数都可以工作。这就是C API知道它已到达字符串末尾的方式

此外,您不希望在字符串数组之前的内存空间中设置新字符。因此,您最好在循环中检查它(并保存最后一个数组项以设置
'\0'

while(ch!='\n'&&i<99)
{
ch=getchar();
字符串[i]=ch;
i++;
}
字符串[i]='\0';//将字符串终止符设置为超过输入的结尾
请记住在将字符复制到
temp\u string
后执行相同操作。(顺便说一句,您可以用对的调用替换该循环,该调用正是这样做的,除了它只有在找到
'\0'
时才会结束)


您可能还想阅读您需要在字符串末尾添加
'\0'
字符,这样
strlen()
printf()
和其他处理字符串的C函数都可以工作。这就是C API知道它已到达字符串末尾的方式

此外,您不希望在字符串数组之前的内存空间中设置新字符。因此,您最好在循环中检查它(并保存最后一个数组项以设置
'\0'

while(ch!='\n'&&i<99)
{
ch=getchar();
字符串[i]=ch;
i++;
}
字符串[i]='\0';//将字符串终止符设置为超过输入的结尾
请记住在将字符复制到
temp\u string
后执行相同操作。(顺便说一句,您可以用对的调用替换该循环,该调用正是这样做的,除了它只有在找到
'\0'
时才会结束)


您可能还想阅读

以下是您的最终代码:

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

int main()
{ 
char ch;
int i = 0, j = 0;
int length = 0;
int lengthsb = 0;
char string[100];
char temp_string[100];

printf(" Enter the string to divide\n ");
while(ch != '\n')
{
ch = getchar();
string[i] = ch;
i++;
}
string[i]=NULL;

printf("%s", string);
i = 0;
while(string[i] != '\0')
{
temp_string[i] = string[i];
i++;
}
temp_string[i]=NULL;

length = strlen(temp_string);
printf("Entered string is  %s and its length is %d\n", temp_string, length);
}
#包括
#包括
#包括
int main()
{ 
char ch;
int i=0,j=0;
整数长度=0;
int lengthsb=0;
字符串[100];
字符临时字符串[100];
printf(“输入要分割的字符串\n”);
而(ch!='\n')
{
ch=getchar();
字符串[i]=ch;
i++;
}
字符串[i]=NULL;
printf(“%s”,字符串);
i=0;
while(字符串[i]!='\0')
{
临时字符串[i]=字符串[i];
i++;
}
临时字符串[i]=NULL;
长度=strlen(临时字符串);
printf(“输入的字符串为%s,长度为%d\n”,临时字符串,长度);
}

在上面的代码中,您缺少的是NULL或字符串的“\0”结尾。我添加它只是为了让它有用。

这是您的最终代码:

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

int main()
{ 
char ch;
int i = 0, j = 0;
int length = 0;
int lengthsb = 0;
char string[100];
char temp_string[100];

printf(" Enter the string to divide\n ");
while(ch != '\n')
{
ch = getchar();
string[i] = ch;
i++;
}
string[i]=NULL;

printf("%s", string);
i = 0;
while(string[i] != '\0')
{
temp_string[i] = string[i];
i++;
}
temp_string[i]=NULL;

length = strlen(temp_string);
printf("Entered string is  %s and its length is %d\n", temp_string, length);
}
#包括
#包括
#包括
int main()
{ 
char ch;
int i=0,j=0;
整数长度=0;
int lengthsb=0;
字符串[100];
字符临时字符串[100];
printf(“输入要分割的字符串\n”);
而(ch!='\n')
{
ch=getchar();
字符串[i]=ch;
i++;
}
字符串[i]=NULL;
printf(“%s”,字符串);
i=0;
while(字符串[i]!='\0')
{
临时字符串[i]=字符串[i];
i++;
}
临时字符串[i]=NULL;
长度=strlen(临时字符串);
printf(“输入的字符串为%s,长度为%d\n”,临时字符串,长度);
}

在上面的代码中,您缺少的是NULL或字符串的“\0”结尾。我添加它只是为了让它有用。

string
不是以NUL结尾的(
'\0'
)。
temp\u string
也不是以NUL结尾的(
'\0'
)。也不是
temp\u string
谢谢我的问题得到了答案:)谢谢我的问题得到了答案:)请接受帮助你的问题(单击检查)。谢谢我的问题得到了答案:)请接受问题(单击检查)这对你很有帮助。谢谢你我得到了我查询的答案:)谢谢你我得到了我查询的答案:)谢谢你我得到了我查询的答案:)
NULL
是一个指针-你不应该将它分配给
char
-对stri使用
'\0'