Строки, взятые у пользователя в C, шифруются - PullRequest
1 голос
/ 19 марта 2011

Я написал следующий код на C, чтобы получить список строк от пользователя. Но сохраненные строки выдают странные значения.

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


#define MAX_STRING_LENGTH 50


void readInStrings(char* arr[],int n)
{
  int i=0;
  char line[MAX_STRING_LENGTH];

  for(i=0;i<n;i++){
    arr[i]=malloc(MAX_STRING_LENGTH);
    printf("Enter another string : ");
    scanf("%s",&arr[i]);
    //fgets(&arr[i],MAX_STRING_LENGTH,stdin);
  }



  printf("Strings read in correctly.... \n");

  printf("Displaying out all the strings:   \n");
  for(i=0;i<n;i++){
    printf("%s\n",&arr[i]);
  }
}



void testStringInputs()
{
  printf("Enter the number of entries : ");
  int n;
  scanf("%d",&n);

  char* strings[n];
  readInStrings(strings,n);
}

Образец ввода:

Введите количество записей: 3
Введите другую строку: Алладин
Введите другую строку: Барак Обама
Введите другую строку: строки прочитаны правильно ....
Отображение всех строк:
AllaBaraObama
BaraObama
Обама

Проблемы: 1) Почему одна строка вообще не принимается в качестве входных данных?
2) Почему отображаемые строки шифруются так?

Проблема та же, если я использую get () или fgets () вместо scanf ().

Ответы [ 3 ]

4 голосов
/ 19 марта 2011

arr [i] уже указатель, вам не нужно &

1 голос
/ 19 марта 2011

Удаление & (как заметил первый ответчик) в scanf("%s",&arr[i]); и printf("%s\n",&arr[i]); помогло мне. Кроме того, учтите, что если вы скомпилировали предупреждения на самом высоком уровне, ваш компилятор сразу сказал бы вам, что символ & был не на своем месте.

1 голос
/ 19 марта 2011

Лучше использовать массив массивов (двумерный) вместо массива указателей. Мне было тяжело исправлять твой код. Поэтому я изменил код на этот

#include <stdio.h>
#include <stdlib.h>
#define MAX_STRING_LENGTH 50
void readInStrings(char (*arr)[MAX_STRING_LENGTH],int n)
{
  int i;
  for(i = 0 ; i< n+1; ++i)
   fgets(*(arr+i),MAX_STRING_LENGTH,stdin);
  printf("Strings read in correctly.... \n");
  printf("Displaying out all the strings:   \n");
  for(i=0;i< n+1;i++){
    printf("%s",arr[i]);
  }
}
int main()
{
  printf("Enter the number of entries : ");
  int n;
  scanf("%d",&n);
  char strings[n][MAX_STRING_LENGTH];
  readInStrings(strings,n);
  return 0;
}
...