2013-02-19 163 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;