2014-12-31 2 views
-1

Как вы можете использовать scanf в c для чтения строки между скобками? например, как я могу получить «myString», если текст в файле «text a 123 (myString) text»?Как использовать fscanf для чтения из (to)?

+2

Этот вопрос должен быть задан на сайте программирования например, stackoverflow или [программисты] (http://programmers.stackexchange.com) – Albert

+0

Этот вопрос кажется вне темы, потому что речь идет о программировании на C (и на самом деле не имеет ничего общего с Unix или Linux). Пожалуйста, рассмотрите [так]. – derobert

+0

Вместо того чтобы пытаться сжать 'scanf()' до предела того, что он может сделать, и риск создать ошибку, подумайте об использовании библиотеки regexp. – potrzebie

ответ

0

Просто читать вашу линию вы можете иметь что-то вроде

char a[50]; 
fscanf(stdin,"%*s %*s %*d (%[^)]) %*s",a); 
+0

Этот ответ неверен. 'a' - массив символов. Вызов 'fscanf()' должен принимать 'a' как аргумент, а не' & a'. – ace

+0

Цитата из [this SO answer] (http://stackoverflow.com/a/5407121/3488231), «это неправильно, и это может потерпеть неудачу на некоторых платформах». Они являются указателями на разные типы. Если вы скомпилируете gcc, это отобразится: 'warning: format '% s' ожидает аргумент типа 'char *', но аргумент 2 имеет тип 'char (*) [50]' [-Wformat =]' – ace

+0

@ace Очень сложно, почему это может потерпеть неудачу, и как ответ говорит, кто знает, на какой платформе это выходит из строя. – Gopi

0

Полный пример:

#include <stdio.h> 

int main(){ 
    const char data[] = "text a 123 (myString) text"; 
    char str[20]; 
    sscanf(data, "%*s %*c %*d (%[^)]", str); 
    puts(str); 
    return 0; 
} 

Обновлено:

Вы можете заменить sscanf строку со следующим (игнорировать не avrytihing до ( и затем читать до ):

sscanf(data, "%*[^(](%[^)]", str); 

Примечание: Я не уверен, насколько переносима такая практика программирования, но она работает хотя бы на Ubuntu 12.04.

0

Пример:

#include <stdio.h> 
#include <stdlib.h> 
int main(){ 
     char mystring[1025]; 
     FILE * fp = NULL; 
     fp= fopen("dd.txt","r"); 
     if(!fp){ 

     }else{ 
       fscanf(fp, "%*s %*c %*d (%[^)] %*s",mystring); 
       printf("%s\n",mystring); 
     } 

     fclose(fp); 

} 
1

Вы можете использовать %[] в качестве бедного человека регулярного выражения:

#include <stdio.h> 

int main(){ 
    const char data[] = "text a 123 (myString) text"; 
    char str[20]; 
    int cr = sscanf(data, "%*[^(](%[^)])", str); /* skip until '(' and read up to ')' */ 
    if (cr == 1) { 
     printf(">%s<\n", str); 
    } 
    else { 
     printf("NOT FOUND\n"); 
    } 
    return 0; 
} 

выше программы корректно выводит:

>myString< 
+0

Вероятно, достаточно хорошо для OP, но это не гарантирует окончательный '') '' существовал или последующий «текст». – chux

Смежные вопросы