Хранить два целых числа из строки в C - PullRequest
0 голосов
/ 06 октября 2011

Я пытаюсь написать программу, которая печатает два числа из строки.

Например, string = '20, 66 'Я пытаюсь разбить эту строку на части, чтобы я мог сохранить' 20 'и' 66 'в две отдельные переменные.

Вот код, над которым я работаю:

#include <stdio.h>

char line[80];

int main(void)
{
    // Variables
    int start_number, end_number;
    int i, j;

    while(1)
    {
        printf("Enter a number: ");
        fgets( line, sizeof(line), stdin);

        // How to find Comma
        for( i=0; i < strlen(line); i++)
        {
            if(line[i]==',') break;
        }

        // How to find two numbers
        for(j = 0; j < i; j++)
        {
            printf("1: %c\n", line[j]);         
        }

        for(j = i + 1; j < strlen(line); j++)
        {
            printf("2: %c\n", line[j]);
        }

        if (strcmp(line, "quit\n") == 0)
        {
            printf("Now terminating program...");
            break;
        }       

    }   
}

Пока я могу хранить только однозначные переменные и по какой-то причине печатать дополнительную строку.

Любые предложения или советы будут оценены.

Ответы [ 5 ]

4 голосов
/ 06 октября 2011

Довольно просто:

const char *text = "20,30";
const char *rest = 0;
int first = strtol(text, &rest, 10); // input, pointer to remaining string, base (10 = decimal)
rest += 1; // skip the comma; this is error prone in case there are spaces!
int second = strtol(rest, NULL, 10); // not interested in remaining string, so pass NULL this time
2 голосов
/ 06 октября 2011

Посмотрите на scanf и его родственников:

#include <stdio.h>

int main() {
  int x, y;
  sscanf("22,33", "%d,%d", &x, &y);
  printf("Scanned vars: %i %i\n", x, y);
}
tmp]$ ./a.out 
Scanned vars: 22 33

Возможно ввести уязвимости безопасности, поэтому обязательно прочитайте и поймите раздел о security , чтобыу вас достаточно памяти для значений, которые вы пытаетесь отсканировать.

2 голосов
/ 06 октября 2011

Один из многих подходов: Как только вы найдете запятую, вы можете изменить запятую на (char)0.Тогда у вас будет две строки, одна будет line, другая будет line+comma_offset+1.Оба являются просто числами и могут быть переданы atoi.

Этот трюк работает благодаря тому, как реализованы строки C - конец строки равен 0. Итак, вы берете строку:

'1'  '2'  ','  '3'  '4'  0x00
 |
line

и замените запятую на ноль:

'1'  '2'  0x00 '3'  '4'  0x00
 |              |
line            str_2

, тогда у вас есть две строки C.Так работают strtok и strtok_r.

0 голосов
/ 06 октября 2011
#include <stdio.h>

char line[80];

int main(void)
{
    // Variables
    int start_number, end_number;
    int i, j;

    while(1)
    {
        printf("Enter a number: ");
        fgets( line, sizeof(line), stdin);
        for( i=0; i < strlen(line); i++)
        {
              char num[];
            if(line[i]!=','){
                num[j++] = line[i];  
            }
            else{
                for(int x =0 x<strlen(num); x++) 
                    printf("Number :%c", num[x]);
                j=0;
              }
        }
    }
}
0 голосов
/ 06 октября 2011

Возможно, вы не хотите, чтобы "1:" и / или NEWLINE ("\ n") печатались в цикле for.Измените это:

for(j = 0; j < i; j++)
{
    printf("1: %c\n", line[j]);
}

на это:

printf("1: "); 
for(j = 0; j < i; j++)
{
    printf("%c", line[j]);
}
printf("\n"); 
...