【问题标题】:How does adding n integers to a string result in subtracting the first n characters?将 n 个整数添加到字符串中如何减去前 n 个字符?
【发布时间】:2020-12-11 03:45:35
【问题描述】:

在尝试找出如何比较字符串的结尾时,很多答案建议:

(strncmp(string1 + length_string1 - length_string2, string2, length_string2)

很好用,我了解strncmp 的基本实现,但我很难理解以下表达式的工作原理:

string1 + length_string1 - length_string2

您如何能够在strncmp 内部使用+ 运算符与const char* (string1) 和int (或size_t) (length_string1) 但是当我编译关注

int n = string1 + length_string1 - length_string2;

我得到一个错误?该错误是有道理的(当然,不能使用字符串初始化 int)但是在 strncmp 内部执行此操作的能力让我回避了。

在某些函数中使用时,将n 值添加到string1 会如何删除第一个n 字符?例如:

在试验printf("%s", s + 3); 时,const char* s = "Hello World"; 打印了lo World,为什么会发生这种情况?

【问题讨论】:

    标签: arrays c string operators c-strings


    【解决方案1】:

    示例:

    const char* s = "Hello World"
    printf("%s", s + 3);
    

    输出:lo World

    解释:

    您的“printf()”示例只是打印“Hello World”...从第 4 个字符而不是第一个字符开始。

    这不是“减去”任何东西。它只是从不同的地方开始:)

    完整示例:

    #include <stdio.h>
    #include <string.h>
    
    int main(int argc, char *argv[]) {
      const char* s = "Hello World";
      const char a[] = "Hello World";
    
      printf("%s\n", s);  // "Hello World"
      printf("%s\n", s + 3);  // "lo World"
    
      printf("strlen(s):%ld\n", strlen(s));  // 11 character string
      printf("strlen(s+3):%ld\n", strlen(s+3));  // 8-character string
    
      printf("sizeof(s): %ld\n", sizeof(s));  // 8: 64-bit pointer
      printf("sizeof(a): %ld\n", sizeof(a));  // 12: char[12] (11 characters, + delimiter)
    
      return 0;
    }
    

    【讨论】:

      【解决方案2】:

      在 C 中,字符串是不可变的 char 数组,数组由指向第一个元素的指针及其大小定义。

      例如,char* my_string 和之后的my_string = new char[10] 将创建与char[10] my_string 相同的对象。

      现在将指针p 的值视为内存地址,将整数n 添加到其值将转换为n 内存地址,并将指向p+n

      最后你不能做int n = string1 + length_string1 - length_string2;的原因是因为string1 + length_string1 - length_string2不是int,而是char*类型的指针。如果您真的想将指针的值解释为整数,您可以使用 atoi (http://www.cplusplus.com/reference/cstdlib/atoi/)。

      【讨论】:

        【解决方案3】:

        const char* 是一个指针,因此,与所有其他指针一样(除非它们是常量),如果向其添加标量,它将使指针增加与提供的标量相同的次数。

        s + 3 使得指针将指向第 4 个字符的地址,指向字符串的&amp;s[3],这相当于拥有s = &amp;s[3],在此之后如果您使用@987654326 打印s @ 它将打印从那里开始的所有字符,直到找到一个 nul 字符,当您使用 "%s" 说明符时它会执行此操作。

        注意,字符并没有被删除,只是指针在前面。

        取码:

        const char *s = "Hello world!";
        
        s += 3; //increment 3 times
        printf("%s\n", s);
        
        s -= 3; //decrement 3 times
        printf("%s\n", s);
        

        输出:

        lo world!
        Hello world!
        

        注意字符串还在,可以再次将指针指向字符串的开头。

        int n = string1 + length_string1 - length_string2; 不起作用,因为您将 const char*char* 分配给 int 并且这些不兼容。

        (strncmp(string1 + length_string1 - length_string2, string2, length_string2) 可以正常工作,因为您传递了正确的参数 2 个 char* 参数,如上一段所述。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-05
          • 1970-01-01
          • 1970-01-01
          • 2018-11-25
          • 1970-01-01
          相关资源
          最近更新 更多