0

所以,我正在尝试制作一个简单的程序来反转字符串。当谈到 C 时,我非常耳目一新,尤其是在理解记忆方面。这是我的代码:

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

void reverser(char to_bb[]){
    int counter = strlen(to_bb);      /* size of entry */
    char reversed[counter];         /* creating blank array of same size */
    int counter2 = 0;
    for(counter - 1; counter >= 0; counter--){     /* loop to swap chars */
            reversed[counter2] = to_bb[counter];
            counter2++;
    }
    printf("The reversed: %s\n", reversed);
}

int main(){
    char to_be_reversed[20];
    puts("Enter the string to be reversed: ");
    scanf("%19s", to_be_reversed);
    reverser(to_be_reversed);
    return 0;
}

问题是,我不断收到总线错误。我使用sizeof(to_bb)并了解到它是 4 位,表示to_bb[]只是我的 void 函数中的一个指针。我尝试了很多方法来提取字符串以便我可以操纵它(即调用它的元素),但我没有找到成功。我尝试strcpy()使用*.

感谢您的任何建议。记忆被证明是难以理解的!

4

3 回答 3

1

您首先将\0字符放入数组中,然后创建一个空字符串。

快速修复,改变

for(counter - 1; counter >= 0; counter--){ 

进入

for(--counter; counter >= 0; counter--){ 
于 2013-01-07T19:42:54.737 回答
1

您需要学习使用警告进行编译:

gcc -Wall yourfile.c

In function 'reverser':
11: 5: warning: statement with no effect [-Wunused-value]

for语句的第一部分是赋值:counter - 1不进行赋值。因此它什么也不做,因此你会收到一个警告,告诉你你没有做任何有用的事情。

您可能想了解的另一个真正有用的运算符是运算符,。它允许您在循环体中使用更少的行来完成这样的循环。

for(counter -= 1; counter >= 0; counter--, counter2++)     /* loop to swap chars */

最后,您没有考虑NULL终结者。该函数strlen()为您提供字符串中不包括NULL终止符的字符数。

因此,您应该在循环附加它之后自己考虑这一点,例如:

char reversed[counter+1];
int counter2 = 0;
for(counter - 1; counter >= 0; counter--, counter2++)     /* loop to swap chars */
        reversed[counter2] = to_bb[counter];
reversed[counter2] = '\0';
printf("The reversed: %s\n", reversed);
于 2013-01-07T20:26:19.663 回答
1

在 中for,更改counter - 1counter = counter-1或,等效地,--counter

在 的大小上再添加一个字符reversed并将其设置为'\0',使其以空值结尾。或者,您可以使用以下命令限制打印的字符数:

printf("The reversed: %.*s\n", counter2, reversed);
于 2013-01-07T19:36:57.983 回答