【问题标题】:Displaying pointer substraction显示指针减法
【发布时间】:2019-05-24 02:43:42
【问题描述】:

好的,假设我有一个序列“abcdefg”,我会这样做

char* s = strdup("abcdefg");
char* p;
char* q;
p = strchr(s, 'c');// -> cdefg
q = strchr(p, 'd');// -> defg

我想显示s - p 基本上是 abcdefg - cdefg = ab,我可以使用指针算术吗?

【问题讨论】:

  • 是否可以修改s?你复制了它,所以我怀疑这应该不是问题。

标签: c pointers char sequence


【解决方案1】:

你不能。该字符串保存为以零字节结尾的字母序列。如果您将指针打印为字符串,您将告诉它将序列打印到零字节,这就是您获得cdefgdefg 的方式。没有具有'a', 'b', 0 的字节序列 - 您需要将其复制到新的 char 数组中。 s - p 只会给你2(两者之间的距离) - 没有多少指针算法可以为你复制一个序列。

要获取子字符串,请参阅 Strings in C, how to get subString - 使用 strncpy 复制,然后放置一个空终止符。

【讨论】:

  • MM 说You can 而你说:You cannot。 :))
【解决方案2】:

好的,如果你需要从s 中删除p,下面的代码应该可以工作:

char s[100];  // Use static mutable array
strcpy(s, "abcdefg");  // init array (ok, ok I dont remember the syntax how to init arrays)
char* p = strchr(s, 'c');// -> cdefg
*p = 0;  // cut the found substring off from main string
printf("%s\n", s); // -> ab

【讨论】:

    【解决方案3】:

    你可以这样做:

    printf("%.*s", (int)(p - s), s);
    

    这将打印s,最大长度为p - s,即从sp 的字符数。

    【讨论】:

    • 令人着迷。我不知道精确度会影响这样的字符串。
    • 是否有机会将其保存在char* 指针中,例如:const char *ptr = (int)(p - s), s;
    • @Michi a char * 指向一个字符,指针中唯一可以存储的就是字符的地址
    • @M.M 你说得对。我真的不知道我在想什么。可能sprintf( buf, "%.*s", (int)(p - s), s ); 会完成这项工作。谢谢你:)。
    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多