在c中反转字符串后得到垃圾

Zah*_*hid 1 c arrays string io output

我正在尝试反转字符串。scanf 运行良好,但是当我使用固定字符串时,它会给出垃圾值。那么问题出在哪里呢?

#include<stdio.h>
#include<string.h>
int main()
{
    char s[50]="Hi I Love Programming";
    char rev[strlen(s)];
    int i,k;



    k=strlen(s);
    for(i=0; i<strlen(s); i++)
    {
        rev[k]=s[i];
    k--;
    }

    printf("The reverse string is: %s\n", rev);
}

Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Rob*_*rtS 5

你的程序有两个问题:

\n

1.

\n
char rev[strlen(s)];\n
Run Code Online (Sandbox Code Playgroud)\n

您忘记为字符串终止空字符添加元素\'\\0\'

\n

使用:

\n
char rev[strlen(s) + 1];\n
Run Code Online (Sandbox Code Playgroud)\n
\n

此外,您还忘记在反转字符串的末尾附加此字符。

\n

使用:

\n
size_t len = strlen(s);\nrev[len] = \'\\0\';\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,我的lenk您提供的代码中的。我使用标识符是len因为该对象的意图更加明显。您可以使用strlen(s),因为字符串具有相同的长度,无论方向正确还是相反,\xc2\xb4 都无关紧要。

\n
\n

2.

\n
k=strlen(s);\n\nfor(i=0; i<strlen(s); i++)\n{\n    rev[k]=s[i];\n    k--;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

rev[k]您访问数组之外​​的内存时rev,因为索引计数从 开始0,而不是1。因此,行为是未定义的

\n

k需要是strlen(s) - 1

\n
\n

需要注意三点:

\n
    \n
  1. 的返回值strlen()是 类型size_t,因此 类型的对象size_t适合存储字符串长度,而不是int

    \n
  2. \n
  3. 更有效的是计算一次字符串长度,而不是在每个条件测试中计算一次。使用第二个对象来存储字符串长度并在循环条件中使用该对象for,例如i < len2.

    \n
  4. \n
  5. char s[50]="Hi I Love Programming";可以简化为char s[]="Hi I Love Programming";- 编译器自动检测存储字符串+终止空字符所需的元素数量。这既节省了不必要的内存空间,又确保分配的空间足以容纳带有空字符的字符串。

    \n
  6. \n
\n
\n

代码还可以简化(网上例子):

\n
#include <stdio.h>\n#include <string.h>\n\nint main(void)\n{\n    char s[] = "Hi I Love Programming";\n    size_t len = strlen(s);\n\n    char rev[len + 1];\n    size_t i,j;\n\n    for(i = 0, j = (len - 1); i < len; i++, j--)\n    {\n        rev[j] = s[i];\n    }\n\n    rev[len] = \'\\0\';\n\n    printf("The reverse string is: %s\\n", rev);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
The reverse string is: pgnimmargorP evoL I iH\n
Run Code Online (Sandbox Code Playgroud)\n