用外部函数反转字符串
Reverse string with external function
我最近开始了一门 C 语言编程课程。我接到了一个任务,我要用这个声明创建一个外部函数:
void reverse(char *array, 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);
}
你的函数有一个经典问题:你在原地反转字符串。您用末尾的字符覆盖字符串开头的字符。当您到达中点时,初始字符会丢失。您应该交换两端的字符并在中点停止。
即使您使用中间变量,您的代码也会将字符串反转两次,使其保持原样。对代码的一个小改动将 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
数组来反转 string.Try,如下所示:
#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] = '[=10=]';
strcpy(arr,buffer);
}
防止覆盖数组的一种简单方法是将数组复制到一个临时数组中,然后将反向读取的临时数组写入另一个数组。
如果你想在编译时有一个未知的数组大小来反转,我建议你使用堆数组(参见man malloc)而不是堆栈一来防止segmentation fault
if numberOfChars
太高了。
我最近开始了一门 C 语言编程课程。我接到了一个任务,我要用这个声明创建一个外部函数:
void reverse(char *array, 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);
}
你的函数有一个经典问题:你在原地反转字符串。您用末尾的字符覆盖字符串开头的字符。当您到达中点时,初始字符会丢失。您应该交换两端的字符并在中点停止。
即使您使用中间变量,您的代码也会将字符串反转两次,使其保持原样。对代码的一个小改动将 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
数组来反转 string.Try,如下所示:
#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] = '[=10=]';
strcpy(arr,buffer);
}
防止覆盖数组的一种简单方法是将数组复制到一个临时数组中,然后将反向读取的临时数组写入另一个数组。
如果你想在编译时有一个未知的数组大小来反转,我建议你使用堆数组(参见man malloc)而不是堆栈一来防止segmentation fault
if numberOfChars
太高了。