C 在下面的程序中,字符串末尾是否有额外字符?
这个程序是把句子中的前两个单词放在末尾,然后作为一个字符串输入和输出 但最后我得到了额外的“^” 输入: 我现在要去找伍基人 预期产出: 现在去找伍基人我会的 获得的产量: 现在去找伍基人,我会的 包括 包括 int main{ 字符a[100],b[100],e[100]; int c=0,i,k=0,j=0; 格萨;C 在下面的程序中,字符串末尾是否有额外字符?,c,C,这个程序是把句子中的前两个单词放在末尾,然后作为一个字符串输入和输出 但最后我得到了额外的“^” 输入: 我现在要去找伍基人 预期产出: 现在去找伍基人我会的 获得的产量: 现在去找伍基人,我会的 包括 包括 int main{ 字符a[100],b[100],e[100]; int c=0,i,k=0,j=0; 格萨; 对于i=0;i您可以将代码修改为: .... } e[i] = '\0'; //<-- with space i crashe
对于i=0;i您可以将代码修改为:
....
}
e[i] = '\0'; //<-- with space i crashed here, with that i get 'get the wookies I will'
strcat(b, e);
printf("%s", b);
return 0;
}
字符串以\0结尾
如果没有\0,stringfunction将一直读取到第1个\0
即使不是字符串内存。此处的行为未定义,因为要附加到字符串b的e字符串中缺少NUL终止符 在我的电脑上,程序实际上崩溃了
for(i=1;i<=c;i++)
{
e[i]=a[i-1];
}
e[i] = ' ';
e[i+1] = 0; // <<<< add this line in your code
strcat(b,e);
printf("%s",b);
return 0;
我对此进行了测试,您的代码在我的系统中运行良好。这可能主要是因为您没有在代码中初始化字符数组a、b、e,它们可能包含垃圾值。在将它们初始化为“0”后,情况不会有任何异常。此外,您不需要在“e[I]中添加额外的空间'在strcat之前调用,如下面的程序所示
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <string.h>
int main()
{
//char a[100]={0},b[100]={0},e[100]={0};
char a[100]={0},b[100]={0},e[100]={0};
int c=0,i,k=0,j=0;
gets(a);
for(i =0;i<=strlen(a);i++)
{
if (a[i] == ' '&& j<2)
{
c=i;
j++;
}
}
for(i=c+1;i<=strlen(a);i++)
{
b[k]=a[i];
k++;
}
e[0]=' ';
for(i=1;i<=c;i++)
{
e[i]=a[i-1];
}
//e[i]=' ';
strcat(b,e);
printf("[%s]\n",b);
return 0;
}
此外,从安全/更好的编程角度来看,在声明变量时初始化变量总是很好的。这样我们就可以确定变量包含哪些值,而不是依赖操作系统来实现这一点。这一行:e[i]='';无法正确终止e中的字符串
因此,当调用printf时,将打印更多字符,直到遇到\0为止
通常,缺少适当的字符串终止字符会导致未定义的行为,从而导致分段错误事件
此问题的症状是额外打印的字符
在内存中遇到\0之前,可能还有其他无法打印的额外字符。gets是邪恶的,请改用fgets。您应该正确设置代码格式,并使用有意义的变量名,而不是b、e、a等。为了便于我们阅读,最好将每个表达式用parens。此外,使用parens可以确保正确的求值顺序。我们中很少有人知道C运算符优先级的所有细节,使用parens可以清楚地将哪些内容分组在一起。由于发布的代码没有注释,变量名也没有意义,包括我在内的大多数人都不会费心尝试反转引擎呃,尝试确定发布的代码要完成什么的代码。i+1将导致“我要得到伍基人”而不是“我要得到伍基人”。e是结尾,所以空格没有意义