2013-11-11 4 views
0

Это вопрос, над которым я работаю.У меня проблема с передачей по ссылке с помощью строки

«Простая схема шифрования с именем« rotate13 »для шифрования текста состоит в том, чтобы преобразовать каждую букву (a ... z или A ... Z) в другую букву, посчитав вперед 13 букв, перейдя от« z »в« a 'или' Z 'обратно в' A ', если необходимо. Напишите функцию с именем rotate13, которая принимает одну строку с нулевым завершением как параметр и преобразует ее в эквивалент rotate 13. Функция должна напрямую изменить строку, и это ничего не должен возвращать. Помните, что только буквы должны меняться, все остальные символы остаются . Вы можете предположить, что ctype.h правильно включен в верхней части вашей программы, поэтому , что вы можете использовать любые функции в библиотеке, если вы пожелание. "

И это ошибка я постоянно получаю

"error C2664: 'rotate13' : cannot convert parameter 1 from 'char (*)[10]' to 'char *[]'" 

Спасибо за помощь. Это поможет мне в моих пересмотрах в финале.

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

int rotate13(char *array[]); 
int size=10; 

int main() 
{ 

    char arr[10]; 

    printf("Please enter the letters you wish to encrypt: "); 
    scanf("%s",&arr); 

    printf("%s",arr); 

    rotate13(&arr); 

    system ("pause"); 
    return 0; 
} 

int rotate13(char *array[]) 
{ 
    int pointer; 
    while(*array[pointer]!='\0') 
    { 
     if(isupper(*array[pointer])!=0) 
     { 
      if(*array[pointer]<'N') 
       *array[pointer]=*array[pointer]+13; 
      else 
       *array[pointer]=*array[pointer]-13; 
     } 
     else 
     { 
      if(*array[pointer]<'n') 
        *array[pointer]=*array[pointer]+13; 
      else 
       *array[pointer]=*array[pointer]-13; 
     } 
     pointer++; 
    } 
    printf("%s", *array); 

    return 0; 
} 

ответ

0

Использование rotate13(arr); вместо rotate13(&arr); и параметр должен быть char [] вместо char *[]

rotate13(&arr); посылает адрес массива в функцию, которая вызывает рассогласование параметров

0
  1. Удалить & из scanf("%s",&arr);

    scanf ("% s", arr);

  2. rotate13 ожидает аргумент типа char ** но, пропусканием &arr вы передаете его аргумент типа int (*)[10]. Передача arr на rotate13 решит вашу проблему.

    rotate13(arr);

+0

Не должен ли аргумент rotate 13 просто быть char *, чтобы весь массив * [указатель] можно упростить? – Atle

+0

@Atle; Да! Но тогда OP должен удалить '*' из всех выражений внутри 'rotate13'. – haccks

0

Вы хотите передать строку в качестве параметра rotate13, так что используйте либо

int rotate13(char *array); 

или

int rotate13(char array[]); 

и передать arr как rotate13(arr). то же самое для scanf("%s",arr);

И внутри функций rotate13, pointer является int (плохое имя переменного), не инициализирован. Для доступа к символам используйте array[pointer], а не *arr[pointer].

Функция должна выглядеть следующим образом:

int rotate13(char array[]) 
{ 
    int n; 
    while(array[n]!='\0') 
    { 
0

Как и другие ответы сказали, что вы лучше не с int rotate13(char array[]).Чтобы понять контекст, вы должны прочитать эту замечательную страницу: http://c-faq.com/aryptr/

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

0

Некоторые вещи нужно объяснить. "string" in C - адрес символьного буфера.

Поскольку идентификатор arr в char arr[10]; деградирует на указатель на первый элемент массива, так что вам не нужно указывать указатель (i.e &) к string в аргументе Scanf.

Пропустив &arr в вашем scanf как scanf("%s",&arr); указателя передается зсапЕ теперь дважды косвенный указатель (это указатель на указатель на начало буфера) и, вероятно, приведет к аварийному завершению программы или другой плохой поведение.

Строки в C, не требуют &array как они неявно передать адрес первого элемента массива символов

Так что ваши два statments scanf("%s",&arr) должны быть просто scanf("%s",arr) и rotate13(&arr) должны быть rotate13(arr). обратите внимание, что адрес первого элемента неявно передается в вызове функций.

Ваша функция rotate13(char *array[ ]) совершенно неправильно способ сделать это

char arr[10] -> can hold single string (simply an array) 
char *array[] -> can hold multiple strings (also called array of pointers) 

формальный параметр должен быть rotate13(char array[]) или rotate13(char *array).

После просмотра кода Я считаю, что вы не изменяя содержимое arr так что вы требуете call by value вместо call by address

char array[] - > call by value , char *array -> call by address 

int pointer ваших переменный не инициализирован до ее использования, ее опасно. Первая инициализация равна нулю.

Изменить все вхождения *array[pointer] к array[pointer]

Если ваши желающим изменить содержание arr использование вызова по адресу просто изменить rotate13(char array[]) к rotate13(char *array) и не забудьте инициализировать переменный указатель на ноль.

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