0

这是我正在研究的问题。

“用于加密文本的名为“rotate13”的简单加密方案是通过向前计数 13 个字母将每个字母(a...z 或 A...Z)转换为另一个字母,从 'z' 循环到 'a' 或 'Z ' 如有必要,返回 'A'。编写一个名为 rotate13 的函数,该函数接受一个以 null 结尾的字符串作为参数,并将其转换为其等效的 rotate13。该函数应直接修改字符串,并且不应返回任何内容。记住, “

这是我不断收到的错误

"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;
}
4

5 回答 5

0

有些事情需要解释。"string" in C是字符缓冲区的地址。

由于 in 中的标识符arr降级char arr[10];为指向数组第一个元素的指针,因此您无需在 scanf 的参数中 指定指向(i.e &)的指针。string

通过传入&arr你的scanfasscanf("%s",&arr);传递给 scanf 的指针现在是一个双重间接指针(它是一个指向缓冲区开头的指针),并且可能会导致程序崩溃或其他不良行为。

c 中的字符串不需要&array,因为它们隐式传递字符数组第一个元素的地址

所以你的两个陈述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[])or rotate13(char *array)

看到您的代码后,我相信您不会更改内容,arr因此您需要 acall by value而不是 acall by address

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

您的变量int pointer在使用之前未初始化,这很危险。首先初始化为零。

更改所有出现的*array[pointer]toarray[pointer]

如果您希望arr通过地址更改使用调用的内容,只需更改rotate13(char array[])rotate13(char *array)并且不要忘记将指针变量初始化为零。

于 2013-11-11T16:11:38.080 回答
0

使用rotate13(arr);代替rotate13(&arr);和参数应该char []代替char *[]

rotate13(&arr);将数组的地址发送给导致参数不匹配的函数

于 2013-11-11T15:23:58.893 回答
0
  1. &从中删除scanf("%s",&arr);

    scanf("%s",arr);

  2. rotate13期待一个类型的参数,char **但是,通过传递&arr你传递给它一个类型的参数int (*)[10]。传递arrrotate13将解决您的问题。

    rotate13(arr);

于 2013-11-11T15:27:29.587 回答
0

您想将字符串作为 的参数传递rotate13,因此请使用

int rotate13(char *array);

或者

int rotate13(char array[]);

并像过去arr一样rotate13(arr)。同样的scanf("%s",arr);

在函数内部rotate13pointer是一个int未初始化的(错误的变量名)。要访问字符,请使用array[pointer],而不是*arr[pointer]

该函数应如下所示:

int rotate13(char array[])
{
    int n;
    while(array[n]!='\0')
    {
于 2013-11-11T15:28:23.557 回答
0

正如其他答案所说,你最好使用int rotate13(char array[]). 要了解上下文,您应该阅读这个精彩的页面:http ://c-faq.com/aryptr/

基本上,在这里传递指向数组的指针是多余的,因为在 C 中,当你将数组传递给函数时,实际传递的是指向其第一个元素的指针。数组本质上是通过引用传递的。

于 2013-11-11T15:52:23.947 回答