Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal,
eu tô tentando desenvolver um esquema de registros de agenda em forma de string em C++.
Então, criei uma funçãozinha e falei: bão, vamos pegar o comprimento da string na base do for, né...
Aí, quando eu executo o projeto abaixo, recebo aquele warning do "deprecated conversion" e não
recebo o número 12 que é o lorem ipsum na main()...
Que sintaxe eu deveria usar para o compilador responder o comprimento da string inserida?
Gostaria de usar só bibliotecas nativas se possível...
Eis os arquivos:
oficina.cpp com a função main()...
#include <iostream>
#include <stdio.h>
#include <agenda.h>
using namespace std;
int main(){
registro("lorem_ipsum ");
return(0);
}
agenda.h setando a função registro(...), que fabricará a string de registro [data - hora : texto] a partir do dados inseridos...
void registro(char string[]);
E o arquivo agenda.cpp
#include <iostream>
#include <stdio.h>
#include <agenda.h>
#include <string>
using namespace std;
void registro(char string[1000]){
int i = 0;
for(i = 0; string[i]!='\0'; i++){}; // Aqui o loop
cout << i;
}
Mas, quando eu executo o projeto, recebo o seguinte warning:
>
deprecated conversion from string constant to ‘char*’
e o 12 que é bom, nada!!
Grato
Lucas Ribeiro
Ok. Não sabia do cstdio...
Mas porque eu não recebo o resultado esperado? Era pra ele falar "12", os doze caracteres do "lorem_ipsum ".
Num era não?
Essa mensagem de aviso aparece durante a compilação, não durante a execução.
A execução do programa exibiu o tamanho corretamente.
>
isis@linux:~/src/imasters> g++ oficina.cpp agenda.cpp -Wall -Wextra -I .
oficina.cpp: In function ‘int main()’:
oficina.cpp:7:28: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
registro("lorem_ipsum ");
^Ah tá, então é o eclipse mesmo né...
tá valendo
Se está usando C++, por que stdio.h? Isso é cabeçalho de C. E se quisesse usar scanf/printf (e outras do stdio.h do C), o cabeçalho correto é cstdio.
>
isis@linux:~/src/imasters> g++ -std=c11 -Wall -Wextra oficina.cpp -I .
cc1plus: warning: command line option ‘-std=c11’ is valid for C/ObjC but not for C++ [enabled by default]
oficina.cpp: In function ‘int main()’:
oficina.cpp:4:28: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
/tmp/ccncq7K3.o: In function `main':
oficina.cpp:(.text+0x11): undefined reference to `registro(char*)'
collect2: error: ld returned 1 exit status
>
-Wwrite-strings
When compiling C, give string constants the type "const char[length]" so that copying the address of one into a non-"const" "char *" pointer produces a warning. These warnings help you find at compile time code that can try to write into a string constant, but only if you have been very careful about using "const" in declarations and prototypes. Otherwise, it is just a nuisance. This is why we did not make -Wall request these warnings.
**When compiling C++, warn about the deprecated conversion from string literals to "char *". This warning is enabled by default for C++ programs.**
****
Sugiro que procure a documentação do compilador p/ esclarecer as mensagens de erro.
P/ a classe string utiliza-se o size do objeto (http://en.cppreference.com/w/cpp/string/basic_string). P/ char * usa-se a função strlen.