以下程序中字符串末尾的额外字符?

时间:2015-07-22 06:41:09

标签: c

这个程序是在句子中取前两个单词并将它们放在最后,输入和输出为单个字符串。

但是我最后得到了额外的'^'。

输入:

  

我现在要去找Wookiee

预期产出:

  

现在去找我的Wookiee

获得输出:

  

现在去找我的Wookiee

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

int main() {
    char a[100], b[100], e[100];
    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", b);

    return 0;
}
  

输入:给印度人民   输出:印度人民

4 个答案:

答案 0 :(得分:2)

我对此进行了测试,您的代码在我的系统中运行良好。这可能主要是因为您没有在代码中初始化字符数组a,b,e,并且它们可能包含垃圾值。在将它们初始化为“0”之后,事情并不奇怪。
另外,在[e]&#39; e [i]&#39中你不需要额外的空间。 ;在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;
}

此外,从安全/更好的编程角度来看,在声明变量时初始化变量总是好的。通过这种方式,我们可以确定变量包含哪些值,而不是依赖于OS。

答案 1 :(得分:1)

您可以将代码修改为:

    ....        
    }
    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一个字符串函数将读取,直到第1 \ 0 即使它不是你的字符串记忆。

答案 2 :(得分:0)

您在此处有未定义的行为,因为您在e字符串中缺少要附加到字符串b的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;

答案 3 :(得分:0)

这一行:e[i]= ' ';无法正确终止e中的字符串,

因此,当调用printf()时,会打印更多字符,直到遇到\0为止。

通常,缺少正确的字符串终止字符会导致未定义的行为,从而导致分段错误事件。

此问题的症状是额外的印刷字符。

可能还有其他额外字符,在内存中遇到\0之前无法打印。