【问题标题】:How does character array behave when initialized via strcpy?通过 strcpy 初始化时字符数组的行为如何?
【发布时间】:2019-03-03 02:50:48
【问题描述】:

我正在编写一个简单的代码来从字符串 s2 中找到字符串 s1,然后将其保存在字符串 s3 中。如果字符串 s1 存在于 s2 中,则该函数返回 1,否则返回 0。我使用指针作为参数。问题是即使我将 s1 分配给 n,第 30 行代码也没有为我提供正确的输出。此外,代码行为异常。能指出错误吗?

#include<string.h>
#include<stdio.h>
int code(char * s2, char * s1, char * s3)
{
    char h[] = "";
    strcpy(h, s2);
    printf("%s\n", h);

    char n[] = "";
    strcpy(n, s1);
    printf("%s\n", n);

    char b[] = "";

    int i = 0, j = 0, flag = 0, flag2 = 0;

    for (i = 0; n[i] != '\0'; i++)
    {
        printf("%d\n", i);
        printf("%c\n", n[i]);
        for (j = 0; h[j] != '\0'; j++)
        {
            printf("%c\n", h[j]);
            if (n[i] == h[j])
            {
                flag = 1;
                break;
            }

        }
        if (flag == 1)
        {
            break;
        }
    }

    printf("%d\n", i);
    printf("%d\n", j);

    printf("%c\n", n[i]);
    printf("%c\n", h[j]);

    printf("\n");

    if (flag == 1)
    {
        printf("Here:1\n");
        printf("%c\n", h[j]);
        while (n[i] != '\0')
        {
            printf("Here: %d\n", i);
            printf("%c\n", n[i]);
            printf("%c\n", h[j]);
            if (n[i] == h[j])
            {
                printf("Here:2 %d %d\n", i, j);
                printf("%c\n", n[i]);
                printf("%c\n", h[j]);
                b[i + 1] = n[i];
                i = i + 1;
                j = j + 1;

            }
            else
            {
                printf("Here:3\n");
                flag2 = 1;
                break;
            }
        }

        if (flag2 == 1)
        {
            printf("Here:4\n");
            return 0;
        }
        else
        {
            printf("Here:5\n");
            b[i + 1] = '\0';
            s3 = b;
            return 1;
        }

    }
    else
    {
        printf("Here:6\n");
        return 0;
    }

}

输入:s2:香草 s1:拉拉

输出:1

【问题讨论】:

  • strcpy为您分配内存。你应该这样做:char *h=malloc(strlen(haystack)+1); strcpy(h, haystack);
  • 您的代码看起来也非常复杂。而且您从不使用s3 等。有很多问题。您可能应该从更简单的内容开始,并阅读 C 教科书中处理字符串和指针的章节。
  • A char* 不是像其他语言那样的预制字符串类。它只是一个指向在别处分配的内存的低级地址。见stackoverflow.com/questions/37549594/…
  • @KrishanPalSingh 好的,现在好多了,但也请说明您如何调用 code 函数。提供minimal reproducible example
  • char h[] = ""; strcpy(h, s2); --> h[] 只是一个 1 char 数组。 stcpy() 肯定会溢出目的地。

标签: c arrays pointers char strcpy


【解决方案1】:

char 数组 hnb 的大小为 1。

在您的代码中进行以下修改:

  char h[100] = "";  // << change here
  strcpy(h, s2);
  printf("%s\n", h);

  char n[100] = "";  // << change here
  strcpy(n, s1);
  printf("%s\n", n);

  char b[100] = "";  // << change here

通过这些修改,数组最多可以包含 100 个字符。现在您的代码似乎或多或少地工作了。

免责声明:

  • 即使进行了这些修改,您的代码仍然很糟糕且效率低下
  • 修改只是快速而肮脏的 hack,如果涉及的字符串长度超过 99,则该功能将不起作用
  • 您的代码中可能存在其他问题
  • s3 = b; 这不起作用有几个原因,但这是另一个话题

【讨论】:

    猜你喜欢
    • 2015-01-31
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    相关资源
    最近更新 更多