2017-10-10 100 views
1

所以它會打印:「AAA QQQ CCC ddd bbb「

但由於某些原因,我不理解它會拋出異常。 我在代碼中寫了錯誤。 我知道我的代碼有點混亂,所以如果你也有建議,我很樂意聽到。

謝謝!!!

void changeWords(char *s,int X, int Y) 
{ 
    int len,words,i,count; 
    len = count = words = i = 0; 
    bool flag = false; 
    while (s[len] != ' ') 
     len++; 
    char *p1 = (char*)malloc(sizeof(char)*(len+1)); 
if (p1== NULL) 
{ 
    printf("Error: memory did not allocated"); 
    exit(1); 
} 
    char *p2 = (char*)malloc(sizeof(char)*(len+1)); 
if (p2== NULL) 
{ 
    printf("Error: memory did not allocated"); 
    exit(1); 
} 
    while (flag == false) 
    { 
     if (count == (X-1)) 
     { 
      for(int x = 0; x< len;x++,i++) 
       p1[x] = s[i]; 
     } 
     else if (count == (Y-1)) 
     { 
      for (int x = 0; x< len; x++,i++) 
       p2[x] = s[i]; 
      flag = true; 
     } 
     if (s[i] == ' ') 
      count++; 
     i++; 
    } 
    p1[len] = p2[len] = '\0'; 
    i = count = 0; 
    flag = false; 
    while (flag == false) 
    { 
     if (count == (X-1)) 
     { 
      for (int x = 0; x< len; x++, i++) 
       s[i] = p1[x]; // here it throw an error "Unhandled exception thrown:.." 
     } 
     else if (count == (Y-1)) 
     { 
      for (int x = 0; x< len; x++, i++) 
       s[i] = p2[x]; 
      flag = true; 
     } 
     if (s[i] == ' ') 
      count++; 
     i++; 
    } 
    puts(s); 
    free(p1); free(p2); 
} 
void main() 
{ 
char*str = (char*)malloc(sizeof(char)); 
if (str == NULL) 
{ 
    printf("Error: memory did not allocated"); 
    exit(1); 
} 
char ch; 
int i = 0; 
printf("Enter a string: "); 
while ((ch = getchar()) != '\n') 
{ 
    str[i] = ch; 
    i++; 
    str = realloc(str, sizeof(char) * (i + 1)); 
    if (str == NULL) 
    { 
     printf("Error: memory did not allocated"); 
     exit(1); 
    } 
} 
str[i] = '\0'; 
func(str,3,5); 
printf("new string: %s\n", str); 

free(str); 
system("pause"); 

} 
} 
+1

你是否在調試器中檢查了代碼並檢查了標記的行上的值? – xxbbcc

+0

字符串文字不能更改。 – BLUEPIXY

+0

's'是一個字符串文字,並且正在'changeWords'中修改它,這是未定義的行爲。改爲'char str [] =「aaa bbb ccc ddd qqq」;'(但不保證這是唯一的問題) – yano

回答

2

當你這樣做:

char * str = "aaa bbb ccc ddd qqq"; 

字符串字面"aaa bbb ccc ddd qqq"被放置在只讀數據段,並str由指向它。在這一點上,改變str指向的是未定義的行爲,並希望能夠引發段錯誤。

如果你絕對要使用指針,試試這個來代替:

char * str = strdup("aaa bbb ccc ddd qqq"); 

這將使字符串的副本堆上,這將是可寫的文字。

一旦你完成它,但你需要free(str);釋放內存。

+0

謝謝!你是對的,當我做到了,它是一個常量,所以它不起作用 – asaf

+0

@asaf注意,'strdup'不是標準C函數。 – gsamaras

+0

'strdup'在POSIX和[動態內存TR](http://en.cppreference.com/w/c/experimental/dynamic)中指定,Windows也有一個,所以代表性很廣。 – rustyx

1

更改此:

char * str = "aaa bbb ccc ddd qqq"; 

這樣:

char str[] = "aaa bbb ccc ddd qqq"; 

,因爲第一個是字符串文字

字符串常量不能被修改,因此您的代碼調用未定義行爲,在你的函數,其中s實際上是字符串文字:

s[i] = p1[x]; 

PS:無關您的問題:What should main() return in C and C++?int


編輯:

如果你真的想使用指針,那麼你可以創建數組,並點的指針的第一個元素。或者,你可以動態地爲你的字符串分配內存,這將是一個矯枉過正的問題。

+0

我用過:char * str =「aaa bbb ccc ddd qqq」;只是爲了檢查代碼,當我完成你將輸入你想要的文本而不知道長度,所以我使用指針 – asaf

+0

我看@asaf,但你不能用字符串文字來做,因爲它們不能被修改。 – gsamaras

0
  • 的變量temp不使用
  • 長度計算是錯誤的。使用來自文庫string.h中的strlen:int len = strlen(s)
  • 我也改變了主要功能:

    INT主(){ 炭STR [20] = 「AAA BBB CCC DDD QQQ」;

    changeWords(str, 3, 5); 
    printf("new string: %s\n", str); 
    return 0; 
    

    }

  • 當我執行,它沒有任何異常。但是你有邏輯問題。你必須找到用''來打破字符串的單詞。你也可以使用strtok函數。

+0

我不想使用數組我想使用指針和學習,並在那得到更好的,也是我想在主要輸入自由文本,我會編輯程序 – asaf