迭代收集C中的char

时间:2018-01-01 22:30:39

标签: c

这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
  int i,j,n;
  scanf("%d",&n);
  n*=n;
  char str[n];
  for(i=0;i<n;i++){
    str[i]='*';
  }
  printf("%s",str);
  printf("\n%d",strlen(str));
  return 0;
}

我输入2,这是我得到的输出:

2
****ú@
7

在第2行中,它有一些奇怪的字符显示在控制台中(U + 0013或控制-S介于ú和@之间),但它没有显示在这里。 你能解释一下吗?

3 个答案:

答案 0 :(得分:1)

printf("%s", str)假设str指向NUL终止的char数组(又名&#34; C string&#34;)。在您的情况下,str未终止NUL,因此printf正在缓冲区的末尾运行,导致未定义的行为。

要解决此问题,您需要做两件事:

  • 为NUL终结器分配一个额外的字节
  • NUL-在您完成写入后终止数组
char str[n+1]
for(i=0;i<n;i++){
    str[i]='*';
}
str[n] = '\0';

答案 1 :(得分:1)

您正在使用%s格式说明符进行打印,该格式说明符需要一个C字符串(char数组末尾有NUL字符)。您需要使最后一个字符\0使printf识别字符串的结尾并停止打印。因此,在数组中再分配一个字符,并将最后一个字符设置为\0

char str[n+1];
str[n] = '\0`;

答案 2 :(得分:0)

您需要NUL终止字符串,如下所示:

char str[n+1];   /// <<<
for(i=0;i<n;i++){
  str[i]='*';
}
str[n]='\0';   /// <<<