【问题标题】:Problems with strcatstrcat 的问题
【发布时间】:2016-10-29 16:29:13
【问题描述】:

我对 C 语言中的 strcat 有一个奇怪的问题。代码如下:

char *getip(char n[])
{
    char *x[255];
    strcat(x, n);
    char *ip;
    ip = strtok(x, "/");
    return ip;
}

char *adrr(char n[])
{
    char *ip[255];
    strcat(ip, getip(n));
    return ip;
}

int main(void)
{
    scanf("%s", &n);
    printf("IP : %s\n", getip(n));
    printf("IP : %s", adrr(n));
}

第一个 printf 返回的正是我希望它返回的内容,虽然函数 adrr 似乎什么也没做,第二个 printf 在它应该返回的内容的开头和结尾返回一些随机字符。

【问题讨论】:

  • char *ip[255] 应该是 char ip[255] 否则它是一个指针数组。好吧,不是字符串。这行不通,因为您要返回对临时对象的引用
  • 首先,将char *x[255] 更改为char x[255]
  • ..并对其进行初始化,以便strcatchar x[255] = {0}; 可以使用它
  • 或直接使用strcpy

标签: c string c-strings strcat


【解决方案1】:

你的代码有很多问题:

  • 你在getip中定义xchar *x[255],应该是char x[255]
  • 您应该在调用strcat 或使用strcpy 之前初始化x
  • ip 指向本地数组 x,将其返回给调用者会调用未定义的行为,因为它指向的数组在函数返回后无法使用。
  • adrr() 中的同样问题
  • n 未在 main 中为 scanf("%s",&n); 定义

第一个函数似乎完全出于运气的预期,在不同的系统上编译时它可能会失败,甚至只是在不同的日子;-)

这里有一个解决方案:

#include <stdio.h>

char *getip(char *dest, const char *src) {
    for (i = 0; src[i] != '\0' && src[i] != '/'; i++) {
        dest[i] = src[i];
    }
    dest[i] = '\0';
    return dest;
}

int main(void) {
    char n[256];
    char ip[256];

    if (scanf("%255s", n) == 1) {
        printf("IP: %s\n", getip(ip, n));
    }
    return 0;
}

【讨论】:

  • n 被声明为 global 。当我将 x 定义为“ char x[255]=""; ”时,getip 函数将不再起作用
  • @Andrei:Bullet #3 专门针对这个问题。为了解决它,您需要将x 声明为static(这意味着如果您从不同的线程调用此函数可能会遇到并发问题),或者动态分配此内存块(这意味着您将必须在程序执行的稍后时间释放它)。
  • 多亏了你们,我刚刚把它变成了 static char x[255]={0}; ,使用 strcpy,现在它似乎工作了。
  • @Andrei:请注意,在函数中创建数组 static 不是正确的解决方案。它可以工作,但它草率且容易出错。您应该为结果传递一个目标数组,或者分配内存并返回分配的指针。两种解决方案都有不同的语义。
  • @chqrlie 再次感谢,我会使用你提供的解决方案
【解决方案2】:
  1. main 中的 n 不存在
  2. 我想你考虑的是 char buf[10] 但写的是 char *buf[10]
  3. 如果返回指向仅存在于函数内部的内存的指针,则结果是未定义的。使其成为静态或动态。

【讨论】:

  • “使其成为静态或动态”应为“声明静态或分配动态”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2013-08-23
  • 2011-07-05
  • 1970-01-01
  • 2011-11-07
相关资源
最近更新 更多