Цикл пока не найдена конкретная строка - PullRequest
0 голосов
/ 27 января 2011

У меня простой вопрос.Я хочу написать программу на C, которая сканирует строки определенного файла, и если единственная фраза в строке - «Атомы», я хочу, чтобы она прекратила сканирование и сообщила, на какой строке она была.Это то, что у меня есть и не компилируется, потому что, по-видимому, я сравниваю целое число с указателем: (конечно, "string.h" включен.

char dm;
  int test; 
  test = fscanf(inp,"%s", &dm);

  while (test != EOF) {
    if (dm=="Amit") {
      printf("Found \"Atoms\" on line %d", j);
      break;
    }
    j++;
  }

файл уже был открыт с:

inp = fopen( .. )

И проверил, чтобы убедиться, что он открывается правильно ...

Я хотел бы использовать другой подход, и мне было интересно, может ли он работать. Вместосканируя отдельные строки, могу ли я отсканировать целые строки следующим образом:

// char tt[200];
//
// fgets(tt, 200, inp);

и сделать что-то вроде:

if (tt[] == "Atoms") break;

Спасибо! Amit

Ответы [ 4 ]

2 голосов
/ 27 января 2011

Не обращая слишком много внимания на ваш настоящий код, самая важная ошибка, которую вы совершаете, заключается в том, что оператор == НЕ будет сравнивать две строки.

В C строка - это массив символов, которыйэто просто указатель.Таким образом, если if ("abcde" == some_string) никогда не будет истинным, если они не указывают на одну и ту же строку!

Вы хотите использовать метод типа "strcmp (char * a, char * b)", который будетвернуть 0, если две строки равны, и что-то еще, если они не совпадают.«strncmp (char * a, char * b, size_t n)» сравнивает первые «n» символов в a и b и возвращает 0, если они равны, что хорошо для просмотра начала строк (чтобы увидетьесли строка начинается с определенного набора символов)

Вам также НЕ следует передавать символ в качестве указателя для% s в вашем fscanf!Это заставит его полностью уничтожить ваш стек, он попытается поместить много символов в ch, в котором есть место только для одного символа!Как говорит Джеймс, вы хотите сделать что-то вроде char ch [BUFSIZE], где BUFSIZE на 1 больше, чем вы ожидаете, что будет одна строка, затем выполните "fscanf (inp,"% s ", ch);"

Надеюсь, это поможет!

1 голос
/ 27 января 2011

В строке с использованием fscanf вы приводите строку к адресу символа.Использование% s в fscanf должно установить строку указателем, а не адресом:

char *dm;
test = fscanf(inp,"%s", dm);

Символ * объявляет косвенное обращение, а именно переменную, на которую указывает dmСтрока fscanf объявит dm ссылкой на строку, захваченную разделителем% s.Он будет указывать на адрес первого символа в строке.

То, что сказал набор, тоже правильно, следует использовать команду strcmp, а не сравнение ==, поскольку == просто сравнит адресаstrings.

Редактировать: То, что говорит комплект ниже, является правильным.Все указатели должны быть выделены памяти, прежде чем они будут использованы, или должны быть преобразованы в заранее выделенное пространство памяти.Вы можете выделить память следующим образом:

dm = (char*)malloc(sizeof(char) * STRING_LENGTH);

, где STRING_LENGTH - максимальная длина возможной строки.Это распределение памяти должно быть сделано только один раз.

1 голос
/ 27 января 2011

обратите внимание, что dm - это одиночный символ, в то время как вам нужен символ *

больше: if (dm=="Amit") неверно, измените его на

if (strcmp(dm, "Amit") == 0)
0 голосов
/ 27 января 2011

Проблема в том, что вы объявили 'dm' как char, а не как malloc'd char* или char[BUFSIZE]

http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

Вы, вероятно, также сообщите о неправильных номерах строк, вам нужно будет просканировать буфер чтения на наличие случаев '\ n' и обработать случай, когда желаемая строка находится за границами буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...