C Строковый ввод путаницы - PullRequest
1 голос
/ 07 апреля 2010

C на самом деле не моя сильная сторона, и после прочтения 3-х глав книги на эту тему и потраченных целых веков попыток заставить вещи работать, это не так:

#include <stdio.h>
char *a,*b;
int main( )
{
     char input[10];
     fgets(input,sizeof input, stdin);
     a = input;
     fgets(input,sizeof input, stdin);
     b = input;
     printf("%s : %s",a,b);

}

Я изолировал проблему от своего основного проекта. Этот код предназначен для чтения в две строки, а затем распечатывает их, однако кажется, что он устанавливает a и b, чтобы указывать на ввод. Пример ввода этого кода при вводе A и B (не беспокойтесь о \ n, я могу их удалить):

A
B
B
 : B

Как сохранить значение ввода в другой переменной, например. а или б, чтобы в приведенном выше случае

A
B
A
 : B

Является ли выход?

ПРИМЕЧАНИЕ: я не хочу, чтобы a или b указывали на другую переменную, я хочу сохранить в них строку:

a = "A";
b = "B";

будет строковым литеральным эквивалентом.

Спасибо

Ответы [ 4 ]

4 голосов
/ 07 апреля 2010

Вам нужно будет либо объявить a и b как отдельные массивы размером с ваш входной массив, либо динамически выделить им память. В любом случае вам придется использовать strcpy() для копирования содержимого одной строки в другую:

#include <stdio.h>
#include <string.h>

int main(void)
{
  char input[10], a[10], b[10];
  fgets(input, sizeof input, stdin);
  strcpy(a, input);
  fgets(input, sizeof input, stdin);
  strcpy(b, input);
  printf("%s : %s\n", a, b);
  return 0;
}
2 голосов
/ 07 апреля 2010

a - указатель на ввод, как и b. Установка a = input просто устанавливает a для указания на ввод.

Так что ваши звонки на fgets влияют на тот же буфер.

Вы должны использовать два отдельных массива для A и B и копировать данные из ввода в A и B.

ПРИМЕЧАНИЕ: я не хочу, чтобы a или b указывали на другую переменную, я хочу сохранить в них строку:

a = "A";

b = "B";

будет строковым литеральным эквивалентом.

К сожалению, C не совсем работает так, как вы думаете. Вы слишком привыкли к высокоуровневым языкам, которые делают для вас копирование.

В C, если вы хотите, чтобы A и B содержали данные, вы должны указать контейнер данных и поместить данные туда.

Например:

int main( ) 
{ 
     char input[10]; 
     char aData[10];
     char bData[10];     
     fgets(input,sizeof input, stdin); 
     strcpy(aData, input);
     fgets(input,sizeof input, stdin); 
     strcpy(bData, input);
     printf("%s : %s",aData,bData);  
}
1 голос
/ 07 апреля 2010

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

#include <stdio.h>
int main( )
{
     char a[10];
     char b[10];
     fgets(a,sizeof a, stdin);
     fgets(b,sizeof b, stdin);
     printf("%s : %s",a,b);

}
1 голос
/ 07 апреля 2010

Используйте 2 разных массива буферов символов.

Указатель - это просто переменная, которая содержит адрес памяти.

Так в следующем коде:

a = input;

b = input;

Оба a и b содержат один и тот же адрес памяти, этот адрес памяти является адресом первого элемента массива.

Это правильный код:

char input1[10];
char input2[10];
fgets(input,sizeof input1, stdin);
fgets(input,sizeof input2, stdin);
printf("%s : %s",input1, input2);

Также, когда вы берете sizeof(pointer), вы всегда получаете 4 в системе x86.Вы не получите размер элемента, на который указывает указатель.

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