C 在下面的程序中,字符串末尾是否有额外字符?

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

这个程序是把句子中的前两个单词放在末尾,然后作为一个字符串输入和输出

但最后我得到了额外的“^”

输入:

我现在要去找伍基人

预期产出:

现在去找伍基人我会的

获得的产量:

现在去找伍基人,我会的

包括 包括 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 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是结尾,所以空格没有意义