2013-02-19 198 views
1

在下面的printf()语句中,我得到一个分段错误:11.没有它,我没有得到任何错误,但我希望能够看到正确的值在newstring值。我如何去做这件事?C打印时出现分段错误

char* newstring; 
    for(int i = 0; i < len; i++) 
    { 
    printf("value %d\n", tempfullstring[i]); 
    if (tempfullstring[i]>=97 && tempfullstring[i] <=122) 
    { 
     char value = tempfullstring[i]; 
     newstring += value; 
    } 
    } 
    printf("The new string is %s", newstrng); 
    return 0; 
+0

哪个printf()行有问题?什么是tempfullstring的内容?你能给我们更多*有用的*代码吗? – Mido 2013-02-19 18:02:07

+0

在您的printf语句中,newstring拼写错误(“newstrng”)。我不确定这是否是您的帖子的本地输入错误,或者它是否反映了您的实际代码。 – Tebc 2013-02-19 18:02:20

回答

2

我想你的C字符串是如何工作的一个误区:

  • 他们获得的声明中初始化(所以char* newstring;必须单独分配,或者你得到了一个未定义的行为)
  • 他们不能用+=运算符连接(这样newstring += value;无效)需要
  • 空间为C字符串被明确管理(所以你将需要在自动存储区中分配您的newstring,或者在末尾添加free)。

固定程序的最简单的方法是猜测newstring是要去多久可以了,使用strcat将数据追加到它:

char newstring[1000]; // some max length 
newstring[0] = '\0'; // make it an empty string 
... 
strcat(newstring, value); // instead of newstring += value 
+0

'newstring + = value'是有效的,它不会做OP认为它做的事情。 – 2013-02-19 18:02:40

+0

@WilliamPursell这就是为什么我说它不会连接,而不是将它称为无效:) – dasblinkenlight 2013-02-19 18:04:43

+0

我理解非常感谢:) – user1840255 2013-02-19 18:54:58

1
newstring += value 

要附加到一个字符串以非法的方式,你实际上在做什么是改变一个未初始化的指针,,所以你正在改变地址到另一个无效的地址,而不是

您应首先,有一些房间,里面有你要的新的字符串,存储与

char newstring[64]; 

,然后通过做

newstring[j] = tempfullstring[i]; 

此次荣获”追加一个字符t追加NUL终止字符,您必须手动将其添加到末尾或使用其他方法(例如使用strncat并直接从原始字符串追加:

strncat(newstring+j, tempfullstring+i, 1); 
+0

是的,它必须,在'strncat'方法中,我使用'i' 'j' – Jack 2013-02-19 18:05:06

+0

我想你是在编辑时编辑的 – Collin 2013-02-19 18:05:29

1

这是您想要使这项工作的代码。

char* newstring = malloc (sizeof(char)*len+1); // this will be worst case (all are >=97 o <=122 
    int j=0; 
     for(int i = 0; i < len; i++) 
     { 
     printf("value %d\n", tempfullstring[i]); 
     if (tempfullstring[i]>=97 && tempfullstring[i] <=122) 
     { 
      char value = tempfullstring[i]; 
      newstring[j]= value; 
      j++; 
     } 
     } 
     newstring[j]='\0'; 
     printf("The new string is %s", newstrng); 
     return 0;