我最近开始了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);
}
答案 0 :(得分:2)
即使您使用中间变量,您的代码也会将字符串反转两次,保持原样。对代码进行少量更改会将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;
}
答案 1 :(得分:1)
您的函数有一个经典问题:您正在将字符串反转到位。使用结尾处的字符覆盖字符串开头的字符。到达中点时,初始字符会丢失。你应该改为从两端交换字符并在中间点停止。
答案 2 :(得分: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);
}
答案 3 :(得分:1)
防止覆盖数组的一种简单方法是将数组复制到临时数组中,然后将反向引用的临时数组写入另一个数组。
如果你想在编译时有一个未知的数组大小来反转,我建议你使用堆数组(参见man malloc)而不是堆栈1以阻止segmentation fault
如果numberOfChars
太高了。