【问题标题】:How do I get a particular part of a string?如何获取字符串的特定部分?
【发布时间】:2018-05-08 10:40:32
【问题描述】:

我正在尝试构建一个从用户那里获得声明的程序 (例如:int xchar idan),然后打开一个新文件,并写入为声明分配内存所需的大小。

我几乎完成了所有工作,甚至在用户声明中充满空格的情况下,但我很难获得变量名的字符串。

我想创建一个函数,它将仅将变量名复制到一个名为var_name 的新字符串并返回它。我该怎么做?

*更新 - 2018 年 5 月 9 日

嘿,我找到了一种只复制部分字符串的方法:

strncpy(var_name, &declaration[7], count);
var_name[count + 1] = '\0';

现在当我返回 var_name 时(var_name 它是一个字符串) 它返回没问题,但是当我将它发送到另一个函数时,它变成了垃圾......

【问题讨论】:

  • 您希望在哪种语言/环境中执行此操作?
  • 在 C,Visual Studio 中
  • 您的意思是要求您编写解析任意 C 变量声明的代码?
  • 您很可能在某个函数中将var_name 声明为局部变量,这意味着它是在堆栈上分配的(在任何常见的现代 C 语言上都可以退出)。更有可能您需要使用 malloc() 或类似方法在堆上分配它。

标签: c string file


【解决方案1】:

不要使用strncpy,它不会像你想的那样:https://randomascii.wordpress.com/2013/04/03/stop-using-strncpy-already/

在您的情况下,假设var_name 足够大,至少count + 1 字节,那么简单地调用memcpy(var_name, declaration + 7, count) 会更好。

您可能在代码中犯了另一个错误(您没有发布):您无法返回本地数组的地址,返回后访问其内容具有未定义的行为。

这是一个简单的函数,您可以使用它来分配和复制字符串的一部分:

#include <stdlib.h>
#include <string.h>

char *substr(const char *s, size_t pos, size_t len) {
    char *p = malloc(len + 1);
    if (p) {
        memcpy(p, s + pos, len);
        p[len] = '\0';
    }
    return p;
}

这样使用:

#include <stdio.h>

int main() {
    char *p1 = substr("Hello world\n", 0, 5);
    char *p2 = substr("Hello world\n", 6, 5);
    printf("%s %s\n", p1, p2);
    free(p1);
    free(p2);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2021-08-12
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多