Problema en la toma de scanf y el almacenamiento de texto en C++

Este es el código de mi programa:

 #include stdio.h
 #include stdlib.h
 #include string.h

 int main () 
 {
        string a;
        string help = "-h";
        printf("Por favor introduzca la orden. Si desea ver la ayuda introduzca -h");
        scanf(&a);
        if ( a == help) 
        {
            printf("\n\nComandos y expresiones de iptables:"); 
        }
        else 
        {
            system("iptables %c && iptables -L -v -n", a); 
        }
        return 0; 
}

El tema es que no consigo que funcione ni el if ni las variables string ya que gcc me dice esto:

TerFirewall.cpp: In function ‘int main()’:

TerFirewall.cpp:5:2: error: ‘string’ was not declared in this scope
  string a;

TerFirewall.cpp:6:9: error: expected ‘;’ before ‘help’
  string help = "-h";


TerFirewall.cpp:8:9: error: ‘a’ was not declared in this scope
  scanf(&a);


TerFirewall.cpp:9:12: error: ‘help’ was not declared in this scope
  if ( a == help) {

He probado varias veces cambiando nimiedades como en vez de usar string para la declaración de las variables, usar char pero dice lo mismo del error "string". También intenté probando otra forma para almacenar el texto en la variable string pero si dejo comillas simples sigue el mismo error y si se las saco dice que la variable h no ha sido declarada.

Y con el if es algo parecido porque no reconoce el help. Y con scanf() no sé como hacer ya que he visto en otros foros que es mejor que getchar(), pero no sé.

2
задан 17.06.2016, 18:23
4 ответа

Хоакин, у тебя есть хорошая неразбериха концепций.

1. Включения плохо сделанные.

Включения требуют кавычек или угловых скобок:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

или

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

Различие между использованием кавычек или угловых скобок состоит, где начинаются поиски файла заголовка. Используя кавычки заголовок начнет искаться в папке, где находится файл кода (расширение c или cpp), используя угловые скобки он начнет искаться в папке, в которой будут находиться книжные магазины языка.

Забывать кавычки или угловые скобки спровоцирует неудачи.

2. C он не располагает объектами string.

Заголовок string.h это книжный магазин , что предоставляет серию функций, чтобы работать на договоренностях характеров, конец которых помечен недействительным характером (\0), но он не располагает объектом string.

Объект string принадлежи книжному магазину , и говорится о шаблоне, который управляет о цепях символов, которые не обязательно должны заканчиваться недействительным характером, так как он хранит внутри размер.

Что происходит?

Я подозреваю, что несмотря на то, что ты прикрепил включения плохо, эти правильны в твоей команде, и скопировав прикреплять твой код здесь есть дай форматирование.

Если проблема не формат включений: какова проблема? Так как упомянутое в точке 2: Ты включил заголовок и использованный объект string что не существует (так как он не принадлежит вышеупомянутому книжному магазину), отсюда следует, что ты появилась ошибка:

error: ‘string’ was not declared in this scope

Так как ты не включил подходящий книжный магазин, который был бы:

#include <string>

cúal - заголовок C ++, не C. У заголовков C ++ нет расширения файла: <iostream>, <vector>, <string>, и т.д...., кроме заголовки, которые существуют из-за совместимости с C: <math.h>, <stdlib.h>, <stdint.h>, и т.д....

Большинство заголовков C они располагают версией, несшей в C++ которую лишили расширения, добавили им префикс "c" (например <cmath>, <cstdint>, <cstring>) и они были приспособлены в C++. Если ты работаешь с C++ ты был бы должен использовать вышеупомянутые не те C.

Заключение.

У тебя есть неразбериха между языками, которые ты хочешь использовать, он решает, хочешь ли ты запрограммировать в C ++ или в C и однажды известный, он использует подходящие книжные магазины для этого.

1
ответ дан 24.11.2019, 14:11

Здесь я помещаю ошибки и Ваши исправления.

Error  ----------> Corrección
scanf(&a);          scanf("%c", a);
string a;           char a[800];
string help ="-h";  char help[5] = "help";

scanf (&a) болен в Вашем синтаксисе, так как между двойными кавычками определяется тип переменной, которую он идет хранить непрерывно переменной, в которую он хранится (в этом случае a). С string перемести что-то похожее, так как заявление ошибочное, так как string - сообщение переменной char, которым она определяется, и между [] длина той же самой. То же самое происходит с help.

0
ответ дан 24.11.2019, 14:11
  • 1
    Хоакин, добавляет descripci и # 243; n твой восполни запас, это важно! –  Jorgesys♦ 11.06.2016, 02:08

1. В C, в настоящее время, в начале главной программы, он решается: int main(int argc, char *argv[]) { ..., по умолчанию. Если в составителе, которого ты используешь, он оказывается назначенным по умолчанию по-другому, оставь это, как он появился.

2. Не существует тип string как таковой, а arrays символов с условиями цепей '\0'.

3. scanf он не допускает назначенное по умолчанию место, и не является действительно очищенным. В C также будь доступен gets (), что достаточно лучше.

4. Ты не можешь сравнивать прямо две цепи, потому что их не две переменные а двух arrays символов, это массивы. Тогда мы используем функцию strcmp () для этого.

5. Синтаксис system (), не синтаксис printf, тогда, чтобы обрабатывать инструкцию в формате команды, мы используем sprintf ().

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

int main(int argc, char *argv[]) 
{
        char a[512]="";
        char comm_[570]="";
        printf("Por favor introduzca la orden. Si desea ver la ayuda introduzca -h :\n\n");
        gets(a);
        //  scanf("%s",a);   // scanf() no admite espacios por defecto, por ello puse gets(), que además está más depurado.
        printf("\n");
        if (0 == strcmp(a,"-h")) 
            printf("\n\nComandos y expresiones de iptables:"); 
        else 
        {
            sprintf(comm_,"iptables %s && iptables -L -v -n",a);
            system(comm_); 
        }
return 1; 

Заметь: Я попытался и подтвердил, что функционирует код, который я предлагаю в Дев К. В случае, если в твоем составителе ты не располагаешь gets (), используй scanf (), как он находится в комментарии.

0
ответ дан 24.11.2019, 14:11

Если ты программируешь в C ++ ВїPorque, лучше ты не используешь заголовок <iostream>? это решило бы много проблем и даже сделало бы более читабельным твой код

0
ответ дан 24.11.2019, 14:11

Теги

Похожие вопросы