我正在尝试反转字符串并将反转的字符串写入目标位置。我必须使用相同的基本结构,并且无法弄清楚我的反向函数出了什么问题。
void reverse(const char source[], char destination[]) {
if(source = 0){
return;
}
else
{
reverse(source+1, destination);
destination[strlen(source)-1]=source;
}
}
void testingReverse() {
const char *sources[] = {
"Welcome to CMPSC 311!",
"abcdef",
"_ ab cd ef *"
};
const char *expected[] = {
"!113 CSPMC ot emocleW",
"fedcba",
"* fe dc ba _"
};
char destination[50];
int i;
for (i = 0; i < 3; i++) {
printf("source: \"%s\"\n", sources[i]);
memset(destination, 'x', 49);
destination[49] = 0;
reverse(sources[i], destination);
printf("destination: \"%.49s\"\n", destination);
if (strcmp(destination, expected[i]) == 0) {
printf("----pass----\n");
}
else {
printf("----fail----\n");
}
}
}
以下是我现在得到的结果。
Testing reverse:
source: "Welcome to CMPSC 311!"
Segmentation fault: 11
答案 0 :(得分:1)
您可能疯狂地使字符串反转变得非常复杂。您只需要知道源字符串的长度(并且它就适合目的地),然后以最基本的形式,可以使用索引,例如,通过简单的for
循环将源反向转换为dest。 >
void reverse (char *dst, const char *src)
{
size_t i, j = strlen(src);
for (i = 0; src[i]; i++) /* loop over each char in src */
dst[i] = src[--j]; /* decrement j, reverse copy to dst */
dst[i] = src[i]; /* nul-terminate dst */
}
(注意:src
和dst
参数的顺序已切换为与其他字符串函数(例如strcpy
等一致)。
现在这还远未完成。您想要/需要其他验证以确保您的参数有效,并且反转的源字符串将适合提供的目标缓冲区。添加验证后,您可以执行以下操作,使操作更可靠,例如
#define MAXC 1024
void reverse (char *dst, const char *src)
{
size_t i, j;
/* validate src and dest not NULL */
if (src == NULL || dst == NULL) {
fputs ("error: NULL paraemter passed.\n", stderr);
return;
}
j = strlen(src); /* get index of last char in src */
if (j >= MAXC) { /* validate reversed src fits in dst */
fputs ("error: src exceeds MAXC - 1.\n", stderr);
*dst = 0; /* set dst to empty-string */
return;
}
for (i = 0; src[i]; i++) /* loop over each char in src */
dst[i] = src[--j]; /* decrement j, reverse copy to dst */
dst[i] = src[i]; /* nul-terminate dst */
}
添加所需的#include
文件和一个简短的示例程序,该程序将把作为第一个参数提供的字符串反转到该程序(或者如果没有提供参数,则默认情况下反转"Welcome to CMPSC 311!"
),您可以执行:
#include <stdio.h>
#include <string.h>
#define MAXC 1024
...
int main (int argc, char **argv)
{
char *s = argc > 1 ? argv[1] : "Welcome to CMPSC 311!",
rev[MAXC];
reverse (rev, s);
printf ("original: %s\nreversed: %s\n", s, rev);
}
使用/输出示例
$ ./bin/reverse
original: Welcome to CMPSC 311!
reversed: !113 CSPMC ot emocleW
或者,将字符串作为输入传递给程序:
$ ./bin/reverse "My dog has fleas and my cat has none."
original: My dog has fleas and my cat has none.
reversed: .enon sah tac ym dna saelf sah god yM
仔细检查一下,如果还有其他问题,请告诉我。
答案 1 :(得分:0)
也许这会给你灵感
void reverse(char *str) {
if (*str) {
reverse(str+1);
printf("%c", *str);
}
}
您还可以研究strrev(arr);
https://www.programmingsimplified.com/c-program-reverse-string
答案 2 :(得分:0)
尝试
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void reverse(const char *source , char *destination)
{
int i=0;
int length=0;
length=strlen(source);
if(!length) return;
strcpy( destination , source);
while(source[i])
{
printf("\n%c",source[i]);
destination[length-(1+i)]=source[i];
printf("\n=====> %s",destination);
i++;
}
printf("\n%s", destination);
}
int main()
{
char string[99];
char destination[99];
strcpy( string, "abcdefghijklmnop");
reverse(string, destination);
}