2012-10-12 64 views
7

Tengo un problema con el programa que intento codificar. Es solo un programa de consola de Windows y soy muy nuevo en C++. Es solo mi cuarto programa.¿La comparación con resultados literales de cadena en comportamiento no especificado?

El problema que tengo es que cuando ejecuto mi programa no tengo errores sino muchas advertencias que dicen que "la comparación con el literal de cadena da como resultado un comportamiento no especificado" en las líneas que resaltaré a continuación.

Cuando el programa se ejecuta en lugar de agregar los números que quiero, simplemente me da un número enorme al azar, sin importar lo que puse para mis entradas.

Aquí está el código:

#include <iostream> 

using namespace std; 

int main() 
{ 
    int hold; 
    int i; 
    int n; 
    i = 6; 
    int result; 
    int * price; 
    char items[100][100]; 

    if (items == 0) 
     cout << "No items can be stored"; 
    else 
    { 
     for (n=0; n<i; n++) 
     { 
      cout << "Item#" << n << ": "; 
      cin >> items[n]; 
     } 
     cout << "\nYou Entered: \n"; 
     for (n=0; n<i; n++) 
      cout << items[n] << ", "; 

    } 
    for (n=0; n<i; n++) 
    { 
     if (items[n] == "ab"){ 
     price[n] = 2650; 
     } 

     else if (items[n] == "ae"){ 
     price[n] = 1925; 
     } 

     else if (items[n] == "ie"){ 
     price[n] = 3850; 
     } 

     else if (items[n] == "bt"){ 
     price[n] = 3000; 
     } 

     else if (items[n] == "pd"){ 
     price[n] = 2850; 
     } 

     else if (items[n] == "ga"){ 
     price[n] = 2600; 
     } 

    } 

    for (n=0; n<i; n++) 
    { 
    result = result + price[n]; 
    } 

    cout << "\nTotal gold for this build: " << result; 
    cin >> hold; 
    return 0; 
} 

se aprecia ninguna ayuda. Probablemente haya algo grande que he hecho mal. Los nombres en las declaraciones if son todos marcadores de posición actuales y agregaré mucho más si las declaraciones cuando puedo hacer que funcionen con el 6 puro, que es lo que necesita para funcionar.

+0

'if (items == 0)' eso no tiene ningún sentido.No está asignando dinámicamente 'elementos', es una variable de pila. Esa comparación nunca será cierta. – Praetorian

Respuesta

12

En C++ == sólo se implementa internamente para los tipos primitivos y la matriz no es un tipo primitivo, por lo que la comparación de char[100] y cadena literal sólo compararlos como 2 char* o mejor dicho como 2 punteros y desde este 2 punteros no pueden ser iguales a continuación items[n] == "ae" nunca puede ser verdad, en vez de esto debes usar std::string para sostener cadena como:

std::string items[100]; 
// initialize items 
if(items[n] == "ae") ... 

o se debe utilizar strcmp para comparar cadenas, pero remeber strcmp retorno 0 para cadenas iguales, por lo que su código será como:

char items[100][100]; 
// initialize items 
if(strcmp(items[n], "ae") == 0) ... 

Y una nota adicional es if (items == 0) es inútil, ya que items asignado en la pila y no en el montón!

+0

Muchísimas gracias he logrado que el código funcione, pero todavía muestra el resultado equivocado al final y no puedo entender por qué. – user1742497

1

Está comparando punteros, no las cadenas reales. Utilice la clase C++ string en lugar de char* (o marque how C strings work).

5

En primer lugar, int * price; es un puntero que cuelga; nunca lo inicializa. Que tiene que hacer:

int * price = new int[i]; 

En segundo lugar, por lo general, i denota un índice iterador por lo que sugiero que se quede con que - por lo

for (i=0; i<n; i++) //some more refactoring needed 

En tercer lugar, es necesario comparar arrays de char utilizando strncmp en su caso .

Cuarto y más importante - use std::string y std::vector en su lugar. Esto es C++, no C.

1

Sólo una pequeña cosa que me hizo tropezar un poco, es la diferencia entre comillas simples y dobles, ver: Single quotes vs. double quotes in C or C++

estaba comparando el primer carácter de una cadena con comillas dobles y no comillas simples - la cual dio como resultado el mensaje de error de arriba.

Cuestiones relacionadas