0
#include <stdio.h>    

int main()  
{  
  char s[] = "churchgate: no church no gate";  
  char t[25];  
  char *ss, *tt;  
  ss = s;  
  while (*ss != '\0')  
    *tt++ = *ss++;  
  printf("%s\n", t);  
  return 0;  
}  

这段代码有什么问题?当我尝试运行它时。它显示了一些垃圾值。

4

5 回答 5

3

你从不指向tt任何东西。您需要将其指向t

tt=t; 
于 2012-11-12T20:11:00.573 回答
3
  1. 你忘了tt初始化t
  2. 你的数组太小了。
  3. 你忘了空终止你的数组。
于 2012-11-12T20:12:04.787 回答
1

但是,在内存中试验任意位置可能会很有趣,如果您想要定义的行为,则必须定义访问目标。

在对它进行操作之前,必须将 tt 指向内存空间中的某个已定义区域。

*tt++ = *ss++;

s是 30 个字节。t,如果那是您要使用的那个tt是 25。

于 2012-11-12T20:15:41.173 回答
0

几种可能性,例如:

#include <stdio.h>    

int main()  
{  
  char s[] = "churchgate: no church no gate";  
  char t[25];  
  char *ss, *tt;  
  for (ss=s, tt=t; *ss != '\0' && tt-t < sizeof(t)-1; ss++, tt++)
    *tt = *ss;
  }
  *tt = '\0';

  // or just use strncpy.
  // strncpy doesn't copy the \0 if the size is reached,
  // so account for that.
  strncpy(t, s, sizeof(t)-1);
  t[sizeof(t)-1] = '\0';

  printf("%s\n", t);
  return 0;  
}

您从其他答案中知道您的主要问题:

  1. tt未初始化
  2. 无边界检查t
  3. 复制后没有0终止
于 2012-11-12T20:33:44.507 回答
0

几个问题:

1) "tt" 从未被初始化,并且

2) "s[]" 可能是只读的(取决于编译器/平台)!!!!!!

建议:

#include <stdio.h>

#define MAX_STRING 80

int 
main()  
{  
  char s[MAX_STRING] = "churchgate: no church no gate";
  char t[MAX_STRING];  
  char *ss = s, *tt = t;
  while (*ss)  
    *tt++ = *ss++;
  *tt = '\0'; 
  printf("%s\n", t);  
  return 0;  
}  
于 2012-11-12T20:14:03.567 回答