为什么以下代码给出了垃圾值?
在这里我试图从字符串中逐个获取用户输入的字符串。在下面的代码中,我得到了来自用户的输入并存储在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);
}
答案 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'
时结束。)
答案 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;终止字符串。我刚刚添加它以使其有用。