在循环中使用strlen来反转C中的字符串

时间:2016-12-05 22:44:58

标签: c string

我正在尝试编写一个我输入字符串的代码,然后我将其反转。 I.e。:"诺基亚"到" aikon"。

我已经有了某种方式,但现在我想使用函数strlen()来获取原始字符串的长度,并根据该长度创建新的长度。

以下是代码:

void main(void)
{
    char palavra[10];
    char palavra2[10];
    int i;
    int k;

    printf("Introduza uma string: \n");
    scanf("%[^\n]", palavra);

    for( i = 0, k = strlen(palavra) - 1 ; i <= k; i++, k--)
    {
        palavra2[k] = palavra[i];
    }
    printf("\nString invertida: %s", palavra2);
}

但是我从printf()得到的只是&#34;?&#34;。我做错了什么?

4 个答案:

答案 0 :(得分:6)

您的循环索引以相反的方式运行,因此它们在中间相遇,并且当SETLOCAL for %%a in (*.mp4) do ( MediaInfo --Inform="Audio;%%Format%%" "%%a">codec.txt SET /p codec=<codec.txt DEL codec.txt ECHO %codec% ) pause 时循环停止:一半的字符串未被反转。只需针对i <= k

测试i

另外,您必须以空字符串终止字符串:

strlen(palavra)

(并且您最好存储int len=strlen(palavra); for( i = 0, k = len - 1 ; i < len; i++, k--) { palavra2[k] = palavra[i]; } palavra2[len]='\0'; 的值,因此您只需计算一次)

答案 1 :(得分:2)

尝试这个简单的反向功能:

/* reverse:  reverse string s in place */
void reverse(char s[])
{
    int c, i, j;

    for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

将其集成到您的代码中:

void main(void)
{
    char palavra[10];
    int c, i, j;

    /* read the string */
    printf("Introduza uma string: \n");
    scanf("%[^\n]", palavra);

    /* null-terminate the string */
    palavra[strlen(palavra)] = '\0';

    /* reverse the string */
    for (i = 0, j = strlen(palavra)-1; i < j; i++, j--) {
        c = palavra[i];
        palavra[i] = palavra[j];
        palavra[j] = c;
    }

    printf("\nString invertida: %s", palavra);
}

答案 2 :(得分:1)

上面的答案非常好,我只是通过使用位操作对其进行优化来增强代码。

#include<stdio.h>
int main(void)

{
    char palavra[10];

    printf("Introduza uma string: \n");
    scanf("%[^\n]", palavra);

    char *start=palavra;
    int len = strlen(palavra);
    char *end = (palavra+len-1);

    while(start < end )
    {
            *start = *start ^ *end;
            *end = *end ^ *start;
            *start = *end ^ *start;
            start++;
            end--;

    }


printf("\nString invertida: %s\n", palavra);

return 0;
}

最好使用Bitwise运算符并将迭代次数减少一半,进行内部交换

答案 3 :(得分:-1)

您可以使用递归功能。我正在使用字符串类(特定于C ++),您可以将其更改为char *。

void reverse(string& str, int i, int len)
{
    if(i<len)
        reverse(str, i+1, len-1);
    swap(str[i], str[len]);
}

来电者 - reverse(str, 0, str.length()-1)