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

时间:2014-08-14 20:53:16

标签: c string

为什么以下代码给出了垃圾值?     在这里我试图从字符串中逐个获取用户输入的字符串。在下面的代码中,我得到了来自用户的输入并存储在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);
}

4 个答案:

答案 0 :(得分:3)

您忘记在字符串末尾添加null。 C字符串以空值终止,这意味着c字符串中的所有操作都需要使用null来标记字符串的结尾,包括strlen等函数。

你只需添加即可实现:

string[i] = '\0';

填写完毕后。

另一件事,如果用户输入大于100的字符串会发生什么?最好验证这些情况的输入,否则可能会出现缓冲区溢出。

答案 1 :(得分:2)

您需要添加一个NULL - 在字符串末尾终止。添加\0

答案 2 :(得分:2)

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

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

while (ch != '\n' && i < 99)
{
  ch = getchar();
  string[i] = ch;
  i++;
}
string[i] = '\0'; // set the string terminator past the end of the input

将字符复制到temp_string后,请务必执行相同的操作。 (顺便说一句,您可以通过调用strcpy()替换该循环,这样做完全相同,除了它只会在找到'\0'时结束。)

您可能还想阅读What's the rationale for null terminated strings?

答案 3 :(得分:-1)

这是您的最终守则:

#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);
}

在上面的代码中,您究竟缺少的是NULL或&#39; \ 0&#39;终止字符串。我刚刚添加它以使其有用。