【问题标题】:I tried reversing a string in C without using <string.h> functions, it didn't work我尝试在不使用 <string.h> 函数的情况下在 C 中反转字符串,但它不起作用
【发布时间】:2021-12-14 11:26:53
【问题描述】:

我试图在 c 中反转一个字符串,起初这似乎很容易,但我一直遇到一些奇怪的问题,我似乎不明白它的来源。

字符串 c3 不断显示更多应该显示的字符

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char c1[10];
    char c3[10];
    int i,j,l;

    printf("donner la chaine a inverser\n");
    fflush(stdin);
    gets(c1);

    for(i = 0; c1[i] != '\0'; i++)
    {
    }

    l = i;
    j = 0;

    for(i = l-1; i >= 0; i--)
    {
        printf("%d%d\n", i, j);

        c3[j] = c1[i];
        j++;
    }
    
    printf("%s", c3);

    return 0;
}

我不太确定,但 c3 应该只有 c1 的字符数,但它表明它在 printf("%s", c3); 中包含更多。

我对 c 中的字符串还很陌生,所以我可能错过了一些非常明显的东西。

【问题讨论】:

  • 与您的问题无关,但 C 规范明确表示将仅输入流(如 stdin)传递给 fflush 会导致未定义的行为。跨度>
  • 副本上需要一个终止符 - '\0'。
  • 也永远永远使用gets函数。甚至已经从 C 规范中删除了 dangerous。使用例如fgets 代替。
  • 在 printf 之前添加c3[l] = '\0';

标签: c string


【解决方案1】:

您没有在偏移量c3[i] 处设置空终止符。 printf() 将继续从c3 读取,直到找到一个空字节,因为c3 是一个未初始化的本地对象,printf 可能会根据您的体验读取和输出额外的字符,并可能读取超出具有未定义行为的数组。

还请注意,您不应该使用gets(),因为您无法告诉这个过时的 C 库函数目标数组的大小。

这是修改后的版本:

#include <stdio.h>

int main() {
    char c1[80];
    char c3[80];
    int i, j, len;

    printf("donner la chaine a inverser:\n");
    fflush(stdin);
    if (!fgets(c1, sizeof c1, stdin))
        return 1;

    for (len = 0; c1[len] != '\0' && c1[len] != '\n'; len++)
        continue;

    for (j = 0, i = len; i-- > 0; j++) {
        c3[j] = c1[i];
    }
    c3[j] = '\0';    // set the null terminator
  
    printf("%s\n", c3);

    return 0;
}

【讨论】:

    【解决方案2】:

    答案很简单。假设您的字符串是 abcdef。在 c3 中,您将放入 fedcba,其中 a 在索引 5 处。

    索引 6 会是什么?答案是“没人知道”。它是未定义的。这就是为什么你的字符串后面有垃圾。

    在 C 中,字符串是一个 char 数组,“空终止”(空终止意味着在最后一个字符之后有字符 '\0'(或者只是一个 0(不是 '0'))。

    解决问题的简单方法是将 c3 初始化为 0。

    char c3[10] = {0};

    这样,您的数组将被 NULL 字符填充。

    【讨论】:

    • 非常感谢您解决了我的困惑!使用字符串时一定要牢记
    • 为避免混淆,NULL 最好用于空指针。 NUL 是空字节的 ASCII 名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2021-05-22
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多