2017-10-10 4 views
1

il imprimera: « aaa QQQ ccc ddd bbb "

mais pour une raison quelconque que je ne comprends pas me jeter l'exception. j'ai écrit dans le code où est l'erreur. Je sais que mon code est un peu en désordre donc si vous avez aussi des suggestions je serai heureux d'entendre.

Merci!

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

Avez-vous parcouru votre code dans le débogueur et inspecté les valeurs sur la ligne que vous avez marquée? – xxbbcc

+0

Les littéraux de chaîne ne peuvent pas être modifiés. – BLUEPIXY

+0

's' est un littéral de chaîne, et vous le modifiez dans' changeWords', qui est un comportement indéfini. Changez cela en 'char str [] =" aaa bbb ccc ddd qqq ";' (mais aucune garantie c'est le seul problème) – yano

Répondre

2

Lorsque vous faites ceci:

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

La chaîne "aaa bbb ccc ddd qqq" littérale est placée dans la section de données en lecture seule, et str est fait pour pointer vers elle. À ce stade, changer ce que str points est un comportement indéfini et nous espérons augmenter un segfault.

Si vous voulez absolument utiliser un pointeur, essayez ceci:

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

Cela fera une copie de la chaîne littérale sur le tas, qui sera accessible en écriture.

Une fois que vous en avez terminé, vous devrez ajouter free(str); pour libérer la mémoire.

+0

merci! vous aviez raison quand je l'ai fait, c'était un const donc ça n'a pas marché – asaf

+0

@asaf remarquez que 'strdup' n'est pas une fonction standard C cependant. – gsamaras

+0

'strdup' est spécifié dans POSIX et [TR dynamique de la mémoire] (http://en.cppreference.com/w/c/experimental/dynamic), Windows en a aussi, donc assez largement représenté. – rustyx

1

Modifier ceci:

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

à ceci:

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

depuis la première est une chaîne littérale.

littéraux de chaîne ne peuvent pas être modifiés, ainsi votre code appelle un comportement non défini, dans votre fonction, où s est en fait la chaîne littérale:

s[i] = p1[x]; 

PS: Rien à voir avec votre problème: What should main() return in C and C++?int.


EDIT:

Si vous voulez vraiment utiliser des pointeurs, vous pouvez créer le tableau et le point avec un pointeur vers son premier élément. Ou, vous pouvez allouer dynamiquement de la mémoire pour votre chaîne, ce qui serait une surcharge.

+0

J'ai utilisé : char * str = "aaa bbb ccc ddd qqq"; juste pour vérifier le code, quand je finis vous entrez le texte que vous voulez sans connaître la longueur, donc j'utilise des pointeurs – asaf

+0

Je vois @asaf, mais vous ne pouvez pas le faire avec une chaîne de caractères, car ils ne peuvent pas être modifiés. – gsamaras

0
  • la température variable n'est pas utilisé
  • le calcul de la longueur est erronée. Utilisez strlen de string.h bibliothèque: int len = strlen(s)
  • j'ai changé aussi la fonction principale:

    int main() { ombles str [20] = "aaa bbb ccc ddd QQQ";

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

    }

  • Quand j'exécuté, il n'a pas fait exception. Mais vous avez des problèmes de logique. Vous devez trouver les mots en utilisant '' pour casser la chaîne. Vous pouvez aussi utiliser la fonction strtok.

+0

Je ne veux pas utiliser des tableaux que je veux utiliser des pointeurs et apprendre et aller mieux dans ce domaine, et je veux aussi dans le principal d'entrer du texte libre, je vais éditer le programme – asaf