Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带外部函数的反向字符串_C_Function_Reverse - Fatal编程技术网

C 带外部函数的反向字符串

C 带外部函数的反向字符串,c,function,reverse,C,Function,Reverse,我最近开始了一门C语言编程的课程。我得到了一个作业,我将用这个声明生成一个外部函数: void reverse(字符*数组,int numberOfChars) 我的代码现在看起来像这样。问题是代码只会反转单词的前半部分,而保持后半部分正常 #include <stdio.h> #include <string.h> void reverse(char *array, int numberOfChars) { int i = 0; int j = 0;

我最近开始了一门C语言编程的课程。我得到了一个作业,我将用这个声明生成一个外部函数:
void reverse(字符*数组,int numberOfChars)

我的代码现在看起来像这样。问题是代码只会反转单词的前半部分,而保持后半部分正常

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

void reverse(char *array, int numberOfChars) {
    int i = 0;
    int j = 0;

    for (i = numberOfChars - 1; i >= 0; i--) {
        array[j] = array[i];
        j = j + 1;
    }
}

#define NAMESIZE 100

int main() {
    char word[NAMESIZE];
    int length;

    printf("Enter a word: ");
    scanf("%s", word);
    getchar();

    length = strlen(word);
    reverse(word, length);

    printf("%s\n", word);
}
#包括
#包括
无效反向(字符*数组,int numberOfChars){
int i=0;
int j=0;
对于(i=numberOfChars-1;i>=0;i--){
数组[j]=数组[i];
j=j+1;
}
}
#定义名称100
int main(){
字符字[名称化];
整数长度;
printf(“输入一个单词:”);
scanf(“%s”,单词);
getchar();
长度=strlen(字);
反面(字、长度);
printf(“%s\n”,word);
}

您的函数有一个经典问题:您正在原地反转字符串。您可以用字符串末尾的字符覆盖字符串开头的字符。到达中点时,初始字符将丢失。您应该交换两端的字符,并在中间点停止。

即使使用中间变量,代码也会将字符串反转两次,保持原样。对代码的一个小更改会将
i
j
进行比较,并使用一个临时变量进行交换

int i, j = 0;
char temp;
for(i = numberOfChars-1; i > j; i--){
    temp = array[j];
    array[j] = array[i];
    array[i] = temp;
    j = j + 1;
}

您需要一个辅助
char
数组来反转字符串。请尝试以下操作:

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

#define NAMESIZE 100

void reverse(char *arr,int numberOfChars);

int main()
{
    char word[NAMESIZE];
    printf("Enter a word: ");
    scanf("%s",word);
    getchar();
    size_t length=strlen(word);
    reverse(word,length);
    printf("%s\n",word);
}

void reverse(char *arr,int numberOfChars)
{
    char buffer[NAMESIZE];
   int j = 0,i = numberOfChars;
    while( i-- )
        buffer[j++] = arr[i];
    buffer[j] = '\0';
    strcpy(arr,buffer);
}
#包括
#包括
#定义名称100
无效反向(字符*arr,整数字符);
int main()
{
字符字[名称化];
printf(“输入一个单词:”);
scanf(“%s”,单词);
getchar();
长度=strlen(字);
反面(字、长度);
printf(“%s\n”,word);
}
无效反向(字符*arr,整数字符)
{
字符缓冲区[名称];
int j=0,i=numberOfChars;
而(我--)
缓冲区[j++]=arr[i];
缓冲区[j]='\0';
strcpy(arr,缓冲器);
}

防止覆盖数组的一种简单方法是将数组复制到临时数组中,然后将反向读取的临时数组写入另一个数组中


如果要在编译时反转未知数组大小,我建议您使用堆数组(请参阅)而不是堆栈数组,以防止
分段错误
如果
numberOfChars
太高。

您不需要第二个数组来执行此操作-您只需要一个char的开销存储。这解决了问题!谢谢。没有理由分配内存。函数签名接受一个char*,因此它打算就地进行交换。一个临时字符就可以了。