您好我试图实现一个反向数组代码,但它似乎没有工作,我真的不知道为什么。 For循环似乎不起作用。我不知道为什么,因为逻辑对我来说似乎很合适。
#include <stdio.h>
#include <string.h>
void reverse(char, int);
int main()
{
char a[100];
gets(a);
reverse(a, strlen(a)-1);
printf("%s\n",a);
getchar();
getchar();
getchar();
return 0;
}
void reverse(char ar[], int n)
{
char c;
int i = 0;
printf("n = %d" , n);
for ( i = 0; i >= n ; i++){
c = ar[i];
ar[i] = ar[n];
ar[n] = c;
printf("Processed");
n--;}
}
/*
if (begin >= n)
return;
c = *(x+begin);
*(x+begin) = *(x+n);
*(x+n) = c;
offs = x++;
printf("Begin = %d , n = %d, offs = %p \n", begin, n, offs);
reverse(x, ++begin, --n); */
答案 0 :(得分:4)
void reverse(char, int); //declaration wrong
void reverse(char[], int);
^^^
你的循环
for ( i = 0; i >= n ; i++) // this fails i=0, n=some size
应该是
for ( i = 0; i <= n ; i++)
避免使用gets()
代替fgets()
。
答案 1 :(得分:1)
for循环条件应为'i&lt; N”。原型声明应该匹配。
答案 2 :(得分:0)
for循环条件应为'i&lt; N”。原型声明应该匹配。
和“int n”是数组的大小。所以“i&lt; = n”会使相同的数组从一端到另一次反转,再从中到顶反转。所以结果与数组相同。将“n”设为数组大小的一半。
答案 3 :(得分:0)
我认为最好使用宏来完成这项任务。在下面的代码中,它是宏 SWAP 。
将文件内容main.c
#include <string.h>
#include <stdio.h>
// swap values with respect a type it
#ifndef SWAP
#define SWAP(type, a, b) \
{ \
type temp = a; \
a = b; \
b = temp; \
}
#endif
/*
Print an array integer items
*/
void
printIntArray(int array[], size_t length) {
char ending_charapter[] = ", ";
putchar('[');
for (size_t i = 0; i < length; ++i) {
printf("%d", array[i]);
if (i < length - 1) {
printf("%s", ending_charapter);
}
}
puts("]");
}
/*
Print an array float items
*/
void
printFloatArray(float array[], size_t length) {
char ending_charapter[] = ", ";
putchar('[');
for (size_t i = 0; i < length; ++i) {
printf("%f", array[i]);
if (i < length - 1) {
printf("%s", ending_charapter);
}
}
puts("]");
}
/*
Reverse an integer array in place
*/
static int
reverseIntArray(int *array, const size_t length) {
for (int i = 0; i < length / 2; ++i) {
SWAP(int, array[i], array[length - i - 1]);
}
return 0;
}
/*
Reverse an float array in place
*/
static int
reverseFloatArray(float *array, const size_t length) {
for (int i = 0; i < length / 2; ++i) {
SWAP(float, array[i], array[length - i - 1]);
}
return 0;
}
/*
Reverse an string
*/
static int
reverseString(char string[]) {
size_t str_len = strlen(string);
for (int i = 0; i < str_len / 2; ++i) {
SWAP(char, string[i], string[str_len - i - 1]);
}
return 0;
}
int
main (const int argc, const char *argv[])
{
puts("An example reverse for a int array");
int arrInt[4] = {1, -2, 3, -4};
printIntArray(arrInt, 4);
reverseIntArray(arrInt, 4);
printIntArray(arrInt, 4);
puts("An example reverse for a float array");
float arrFloat[4] = {0.1, -2.12, 1.3, -4.2};
printFloatArray(arrFloat, 4);
reverseFloatArray(arrFloat, 4);
printFloatArray(arrFloat, 4);
puts("An example reverse for a string");
char str[] = "Simple text";
puts(str);
reverseString(str);
puts(str);
return 0;
}
编译为:
gcc std=c11 -I /usr/include/ -o main main.c
<强>结果:强>
An example reverse for a int array
[1, -2, 3, -4]
[-4, 3, -2, 1]
An example reverse for a float array
[0.100000, -2.120000, 1.300000, -4.200000]
[-4.200000, 1.300000, -2.120000, 0.100000]
An example reverse for a string
Simple text
txet elpmiS
备注:强>
基于
4.1 Define a preprocessor macro swap(t, x, y)
4.2 Reversing an array In place
4.3关于这个问题的答案
测试环境
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.6 (jessie)
Release: 8.6
Codename: jessie
$ uname -a
Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
答案 4 :(得分:-1)
不会撒谎,似乎您在“反向函数”中处理的过多。我个人想尽可能地破坏我的代码,以便更容易发现错误。
首先,您可能需要将交换过程(for循环)放在它自己的称为“交换”的函数中。您可以使用char指针“ a”和“ b”作为参数来完成此操作。