2013-03-21 4 views
0

Я хочу, чтобы прочитать данные: образец текст ОПП я вижу это: образца (ввод) текста (ввод) ОПП (ввод)C strtok, введите путем ввод

Однако, мой код не работает Что ж.

#include <stdio.h> 
#include <stdlib.h> 
int main(){ 
    char separator[] = " "; 
    char *schowek; 
    char *wejscie; 

    gets(&wejscie); 
    schowek = strtok(&wejscie,separator); 

    while(schowek != NULL) 
    { 
     printf("%s\n", schowek); 
     schowek = strtok(NULL, separator); 
    } 

    return 0; 
} 

Хорошо, У меня есть этот код.

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

int main() 
{ 

    char * slowo[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", 
"eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", 
"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", "hundred", 
"thousand", "million"}; 
    int liczba[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,30,40,50,60,70,80,90,100,1000,1000000}; 

    char n[]=""; 
    int i=0; 

    char s1[]="zero"; 


    char separator[] = " "; 

    char wejscie[1024]; 
    if (fgets(wejscie, 1024, stdin)) 
    { 
     char* schowek = strtok(wejscie,separator); /* Removed '&'. */ 

     if(strcmp(wejscie,n)==0) 
     { 
      exit; 
     } 

     while (schowek) 
     { 
      printf("%s\n", schowek); 
      schowek = strtok(NULL, separator); 
     } 
    } 
    return 0; 
} 

С ним все в порядке? Теперь я хочу преобразовать строку в число.

Пример ввода

шесть отрицательна семьсот двадцать девять один миллион сто один

Пример вывода

-729

Как я могу это сделать?

+0

Я почти уверен, кому-то еще может потребоваться подтвердить, но я считаю, что 'gets()' является огромной проблемой. 'gets()' будет читать столько символов, сколько до '\ n', которое может читать больше, чем буфер, вызывающий проблемы.Я считаю, что стандартно использовать 'fgets()'. –

ответ

0

Вы не выделили буфер для хранения прочитанных данных.

char *wejscie; 

Выделяет указатель, чтобы согнуть адрес вашего буфера, но не фактический буфер.

gets(&wejscie); 

считывает этот указатель, а не в достаточно большой буфер.

Это способ сделать это (выделяет буфер на стеке):

char buffer[1024]; 
fgets(buffer, sizeof(buffer), stdin); 

Если вы хотите использовать указатель и динамическую память, то это способ сделать это:

char * wejscie = malloc(1024); 
fgets(wejscie, 1024, stdin); 
+0

Не поощряйте использование gets(), оно было удалено на C11. – 2013-03-21 12:16:19

+0

не знал об этом. Я все еще в C99 –

+0

Do [нет] (http://stackoverflow.com/questions/2843073/warninggets-function-is-dangerous) [использовать] (http://stackoverflow.com/questions/1694036/why- is-the-gets-function-is-danger-why-should-not-be-used) получает. – 2013-03-21 12:26:33

3

wejscie - это унифицированный указатель, а gets() записывает в память, что это не должно быть, вероятно, вызывает ошибку сегментации. Обратите внимание, что gets() восприимчив к переполнениям буфера, так как там он не предоставляет возможности для ограничения количества прочитанных символов (см. warning:gets function is dangerous). Используйте fgets() вместо и char[]:

char wejscie[1024]; 
if (fgets(wejscie, 1024, stdin)) 
{ 
    char* schowek = strtok(wejscie,separator); /* Removed '&'. */ 
    while (schowek) 
    { 
     printf("%s\n", schowek); 
     schowek = strtok(NULL, separator); 
    } 
} 

Пока не Релевент к этой программе, просто отметить, что strtok() не поточно.

0

У вас нет памяти для хранения данных. Быстрый пример:

char wejscie[256]; 
gets(wejscie); 

Теперь wejscie указывает на действительный блок памяти.

+0

'wejscie' - это символ для адреса буфера, а не' & wejscie', который является адресом этого символа. –

+0

@SergeyL. С массивами: wejscie == & wejscie. – 2013-03-21 12:19:03

+0

Да, да. Вы, конечно, правы. – yattering

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