Pregunta

Estoy tratando de poner los coeficientes de polinomios de una matriz char en una matriz int
Tengo esto:

char string [] = " -4x ^ 0 + x ^ 1 + 4x ^ 3 - 3x ^ 4 " ;;

y puede tokenizarlo por el espacio en
-4x ^ 0
x ^ 1
4x ^ 3
3x ^ 4

Así que estoy tratando de obtener: -4, 1, 4, 3 en una matriz int

 int *coefficient;
 coefficient = new int[counter];

 p = strtok(copy, "  +");
 int a;
 while (p)
 {
  int z = 0;
  while (p[z] != 'x')
   z++;
  char temp[z];
  strncpy(temp[z], p, z);
  coefficient[a] = atoi(temp);
  p = strtok(NULL, "  +");
  a++;
 }

Sin embargo, obtengo un error que no puedo convertir un char * en un char en strncpy (temp [z], p, z);

error: invalid conversion from ‘char’ to ‘char*’  
error: initializing argument 1 of ‘char* strncpy(char*, const char*, size_t)’

¿Cuál sería la mejor manera de hacer esto?

¿Fue útil?

Solución

Esto:

strncpy(temp[z], p, z);

Debe ser:

strncpy(temp, p, z);

Pero recuerda que strncpy no siempre termina en nulo la cadena.

Además, z será la longitud del coeficiente, pero necesita un byte extra en el búfer para el terminador nulo.

Actualización:

Al examinar su enlace, todavía veo varios problemas serios:

  • No puedes usar " - " en strtok porque recogerá el que está en " -4x " así como los que quieras. Creo que debería dividirse solo en espacios y manejar los operadores +/- como tokens.
  • La función strncpy deja la cadena sin terminar, lo que puede hacer que atoi se bloquee o dé el valor incorrecto al azar. Una forma idiomática es escribir el terminador manualmente, por ejemplo, temp [z] = '\ 0' .
  • La razón por la que no obtiene ningún valor de salida es que coefficient [a] = está escribiendo en una memoria aleatoria porque a no está inicializado.

Otros consejos

Estás pasando un char a strncpy :

  strncpy(temp[z], p, z);

El primer argumento debe ser un puntero char * , no un solo char . Lo que probablemente quieras hacer es:

  strncpy(temp, p, z);

Los otros muchachos tienen razón acerca de que strncpy () 'ing sea temp en lugar de temp [z].

Voy a sugerir que también quieras capturar los exponentes en tu variable libre. Observo un " 0x ^ 2 " implícito Término que pareces estar descuidando. Si su próximo paso es evaluar su polinomio para varios valores de x (o, peor, ejecutar un solucionador en él), deberá conocer esos poderes.

Este tipo de solución se puede hacer fácilmente, pero para que sea a prueba de espacios en blanco adicionales, espacios en blanco faltantes y lo suficientemente amplios para manejar múltiples operadores y nombres de variables, este tipo de estrategia es cada vez más compleja y difícil (especialmente si necesita tiene mensajes de error significativos si el análisis falla).

Me parece que sería más fácil implementar una solución a prueba de balas con boost.regex (o incluso boost.spirit si la tarea general requiere que se analice el orden de las operaciones) que puede manejar fácilmente este tipo de sintaxis con una gran grado de tolerancia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top