2014-10-30 3 views
0

Я хочу disect следующую строку:подстрока строки и распечатать его

char msg[30] ="Hello 13 1"; 
char *psh; 
int num1; 
int num2; 
char s[30],s[30]; 

я попробовать это, но:

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

, который выводит:

Hello 
13 
1 

Я просто хотите сделать число «13» равным num1, число «1» равно num2:

printf("%d\n",num1); 

    Output: 13 


    printf("%d\n",num2); 

    Output: 1 

Стараюсь:

sscanf(sc, "%s %d %d", &s, &num1, &num2); 

, который выводит:

Segmentation fault 

благодаря

[EDIT]

char * pch 
char s[30]; 
char sc[30]; 
char num1[30]; 
char num2[30]; 



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

sscanf(sc, "%s %d %d", pch, &num1, &num2); 
+0

Не используйте адрес-оператор ('&') для строк, они уже являются указателями (или распадаются на указатели в случае массивов). –

+2

И если вы никогда не пытались использовать отладчик раньше, теперь самое подходящее время. Если вы запустите свою программу в отладчике, она остановится в месте аварии. Затем вы можете посмотреть на стек вызовов функций и даже подойти к стеку вызовов, чтобы вы оказались в своем коде (если вас там нет), а затем просмотрите значения переменных. По крайней мере, пожалуйста, создайте с помощью отладочной информации (добавьте флаг '-g' в' gcc') и запустите в отладчике и отредактируйте вопрос, чтобы включить вывод команды 'bt' debugger (которая показывает стек вызовов функций , aka back-trace). –

ответ

1

Используйте функцию sscanf:

sscanf(msg, "%s %d %d", s, &num1, &num2); 

Что бы привести код выглядеть примерно так:

#include <stdio.h> 
int main() 
{ 
    char msg[30] = "Hello 13 1"; 
    int num1, num2; 
    char s[30]; 
    sscanf(msg, "%s %d %d", s, &num1, &num2); 
    printf("%d\n%d\n", num1, num2); 
    return 0; 
} 
+0

Я отредактировал вопрос с фактическим кодом – user3035890

+0

@ user3035890 см. Отредактированный ответ. – Igor

+0

Вы должны проверить возвращаемое значение 'sscanf()', прежде чем полагаться на переменные, имеющие правильные значения. – unwind

1

Если у вас есть код

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

sscanf(sc, "%s %d %d", pch, &num1, &num2); 

то есть undefined behavior, потому что вы пытаетесь написать к NULL указатель.

После цикла pch будет NULL.

Также num1 и num2 являются массивами символов (например, строк), но вы пытаетесь извлечь числа в виде целых чисел. Хотя массивы достаточно велики, чтобы соответствовать целочисленным значениям, все равно неправильно, если вы хотите, чтобы они были действительными целыми числами.

Вы также должны принять во внимание, что strtok изменяет входную строку.

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