Массивы символов, переходящие в функции

В настоящее время у меня проблемы с передачей массивов символов из моей основной функции в некоторую функцию, которая подсчитывает количество элементов в моем массиве.

Я прошу 2 отдельных строковых символа, используя функцию getchar().

Чтобы уточнить, вот фрагмент моего кода:

Я пробовал использовать scanf для &myArray[0] в качестве альтернативы ‹-- это нормально? Учитывая, что пользователь вводит, например, 5 символов, будет ли программа автоматически увеличиваться до &myArray[++] для каждого последующего символа?

#include <stdio.h>
#include <stdlib.h>
#define ARRAY_LEN 20


int match(char s[], char t[] )
{

    int i = 0;
    int j = 0;

    printf("begin: ivaL: %d, jval: %d\n", i, j);
    while(s[i] != '\0')
        i++;

    while(t[j] != '\0')
        j++;

    printf("i val: %d, jval: %d ", i, j); /*J value is messed up, it prints 20+ when ive only typed 5 characters or so*/


}

int main()
{
    int cur = 0;
    char char1[ARRAY_LEN];
    char char2[ARRAY_LEN];
    char c;
    char f;
    printf("Enter char: ");
    while((c=getchar())!=EOF && c!='\n')
    {
        char1[cur++] = c;
    }
    cur = 0;
    printf("\n2nd Char: ");
    while((f=getchar())!=EOF && f!='\n')
    {
        char2[cur++] = f;
        putchar(f);
    }
    putchar('\n')
    printf("Cur value:  %d\n", cur); //here cur accurately prints the correct number of while loops done when counting the characters

    match(char1, char2); /*here i tried to fetch the number of elements in char2 before i passed it to match function and in here char2 is showing correct value, something happens when i pass char2 to the match function*/



}

person jdoecs420    schedule 29.04.2019    source источник
comment
Почему не c=getchar())!=EOF && c!='\n' -> (c=getchar())!='\n' ?   -  person sjsam    schedule 29.04.2019
comment
Вы не нуль, завершающий обе строки. Нулевые символы не добавляются по умолчанию   -  person sjsam    schedule 29.04.2019
comment
В настоящее время я читаю язык программирования C и следую тому же стилю, если я пропущу проверку EOF, ничего не изменится.   -  person jdoecs420    schedule 29.04.2019
comment
@sjsam СПАСИБО! Это решило мою проблему. :) Никогда об этом не думал   -  person jdoecs420    schedule 29.04.2019
comment
вы не можете сделать s[i] != '\0', если вы явно не сделали char1[cur]='\0' сразу после первого цикла while. И аналогично для второго.   -  person sjsam    schedule 29.04.2019
comment
@sjsam Да, я упустил это из виду в своем коде, еще раз спасибо.   -  person jdoecs420    schedule 29.04.2019
comment
@sjsam Кроме того, почему мой первый символ правильно вернул правильное количество элементов массива?   -  person jdoecs420    schedule 29.04.2019
comment
@sjsam, почему ты учишь худшие варианты? Что неправильно, так это то, что c должен быть int.   -  person Antti Haapala    schedule 29.04.2019
comment
@AnttiHaapala Я согласен. Но изменение c на signed int не решит проблему здесь. Независимо от того, операционная проверка для EOF или нет, у них есть более серьезные проблемы для решения. Я упомяну об этом в своем ответе   -  person sjsam    schedule 29.04.2019


Ответы (2)


Ваша функция match() выполняет итерацию по вашим массивам char, пока не найдет нулевой терминатор, но на самом деле вы никогда не ставите нулевой терминатор где-либо в массивах.

printf("Enter char: ");    
while((c=getchar()) !='\n'){
    char1[cur++] = c;
}
char1[cur] = '\0';
cur = 0;
printf("\n2nd Char: ");    
while((f=getchar()) !='\n'){
    char2[cur++] = f;
}
char2[cur] = '\0';
person Pierce Griffiths    schedule 29.04.2019

У вас есть синтаксические ошибки, чтобы разобраться:

putchar('\n') // Missing semicolon.

Нулевые символы не добавляются по умолчанию после чтения набора символов.

while((c=getchar())!='\n')
    {
        char1[cur++] = c;
    }
char1[cur] = '\0'; // Adding a null terminator to make the identifier a C Style string.

И аналогично для второго.

Кроме этого, у вас есть другие проблемы.

int match(char s[], char t[] )

должен возвращать целое число. Вы можете подумать о том, чтобы сделать что-то вроде:

return i==j;

Перехватите все предупреждения компилятора (скажем, используйте -Wall в gcc)

Я могу переписать этот фрагмент кода, как показано ниже::

#include <stdio.h>

#define ARRAY_LEN 30

int match(char * restrict str1,char * restrict str2)
// If str1 and str2 is is the sole agencies dealing with the strings
// then 'restrict' helps compiler with some optimizations.
{
size_t count1=0,count2=0;
while(str1[count1++] != '\0')
  ;;
while(str2[count2++] != '\0')
  ;;
return count1==count2;
// Ideally  count1-1 == count2 -1
// But does that make any difference?
}

int main(int argc,char * argv[])
{
  char str1[ARRAY_LEN];
  char str2[ARRAY_LEN]; // No harm doing so.
  signed x; // If you want to check against EOF
  int count=0;
  while((x=getchar()) != '\n' && x!=EOF )
    // You need to implement bounds check.
    {
      if(count < (ARRAY_LEN - 1))
      {
        str1[count++]=x;
      }
      else
      {
        // C input is buffered
        // so you need to clear the buffer if the string first entered was larger than 30 characters
        while((x=getchar()) != '\n' && x!=EOF )
          ;;
        break;
      }
    }
  // C input is buffered
  // so you need to clear the buffer if the string first entered was larger than 30 characters


  str1[count] = '\0' ; // Null terminating
  count = 0; // Reset count

while((x=getchar()) != '\n' && x!=EOF )
    // You need to implement bounds check.
    {
      if(count < (ARRAY_LEN - 1))
      {
        str2[count++]=x;
      }
      else
      {
        // C input is buffered
        // so you need to clear the buffer if the string first entered was larger than 30 characters
        while((x=getchar()) != '\n' && x!=EOF )
          ;;
        break;
      }
    }
  str2[count] = '\0' ; // Null terminating
  printf("Arrays are of %s length\n",match(str1,str2)?"same":"different");
  return 0;
}

Изменить. Макрос EOF определяется как -1. Чтобы учесть это, x должно быть целым числом со знаком. Прочитайте этот ответ вместе с этим ответом.

person sjsam    schedule 29.04.2019
comment
EOF не является символом, поэтому поведение условия цикла зависит от реализации. - person Pierce Griffiths; 29.04.2019
comment
@PierceGriffiths Правильно, я уже упоминал об этом в вопросе comment . Изменил спасибо. - person sjsam; 29.04.2019