【问题标题】:Getting garbage after reversing string in c在c中反转字符串后得到垃圾
【发布时间】:2020-08-30 20:30:38
【问题描述】:

我正在尝试反转字符串。 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);
}

【问题讨论】:

  • 如果你得到垃圾,那意味着你犯了一个错误。我建议您开始使用调试器并调查错误在哪里。调试很重要!
  • 您还应该阅读有关字符串的内容,尤其是“终止 null”约定。
  • 请在您的问题中将纯文本显示为文本。无需截图。

标签: c arrays string io output


【解决方案1】:

您的程序有两个问题:

1.

char rev[strlen(s)];

您忘记为以字符串结尾的空字符 '\0' 添加元素。

用途:

char rev[strlen(s) + 1];

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

用途:

size_t len = strlen(s);
rev[len] = '\0';

注意,我的len 是您提供的代码中的k。我使用标识符len,因为该对象的意图更明显。您可以使用strlen(s),因为字符串的长度相同,无论方向正确还是相反。


2.

k=strlen(s);

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

使用rev[k],您可以访问数组rev 之外的内存,因为索引计数从0 开始,而不是1。因此,the behavior is undefined

k 必须是strlen(s) - 1


注意三点:

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

  2. 宁可一次计算字符串长度,而不是在每个条件测试时计算,效率更高。使用第二个对象来存储字符串长度,并在for 循环的条件下使用该对象,例如i &lt; len2

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


代码也可以简化(Online example):

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

int main(void)
{
    char s[] = "Hi I Love Programming";
    size_t len = strlen(s);

    char rev[len + 1];
    size_t i,j;

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

    rev[len] = '\0';

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

输出:

The reverse string is: pgnimmargorP evoL I iH

【讨论】:

  • @ZahirulIslamNahid 您是如何准确更改您的代码的?你是怎么编辑的?
  • ``` #include #include int main() { char s[50]="Hi I Love Programming";字符 rev[strlen(s)+1];整数 i, k;整数搜索[3]; for(i=0; i
  • @ZahirulIslamNahid 我这个傻瓜。将size_t len = strlen(rev); 更改为size_t len = strlen(s); 这是可能的,因为字符串长度保持不变。前者不起作用,因为rev 中没有字符串。
  • @ZahirulIslamNahid k 也应该是 size_t 类型。计算一次size_t len = strlen(rev);,然后将len 分配给len2,例如:size_t len2 = len;。使用 len2 而不是 `k`。
  • @ZahirulIslamNahid 我添加了如何使用上述更正部分以更简单的方式重写您的代码。它在我的机器上工作。看看吧。
【解决方案2】:

你的程序很难理解。这里你有一些更简单的东西(如果你当然想反转字符串)

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

char *revstr(char *str)
{
    char *start = str;
    char *end;

    if(str && *str)
    {
        end = str + strlen(str) - 1;
        while(start < end)
        {
            char tmp = *end;
            *end-- = *start;
            *start++ = tmp;
        }
    }
    return str;
}


int main()
{
    char s[50]="Hi I Love Programming";

    printf("%s", revstr(s));
}

https://godbolt.org/z/5KX3kP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2016-09-29
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多