【问题标题】:String manipulation in C: Is this possible?C中的字符串操作:这可能吗?
【发布时间】:2014-04-25 12:11:55
【问题描述】:

当我进行比较时,我试图在另一个字符串的末尾添加一个字符串。这就是我在 java 中的做法(可能不是合法的 java 代码 - 已经有一段时间了):

String input = "addl $1,%eax";

String[] registers = {"eax", "abx", "ebx", "edx"};
String s = "addl $1,%";

for (int i = 0 ; i < 4; i++) {
    if (input.equals(s + registers[i])) {
        printf("Match");
        // write out optimized code with specified register
    }
}

我完全不确定如何在 C 中执行此操作。我尝试了以下方法,但我的程序不断崩溃(我认为是因为一些指针废话):

 ...
 char *in = "Hell";
 char *pattern = "Hello";  
 const char *a[2];
 a[0] = "e";
 a[1] = "o";
 char *result = strcat(in,a[1]);
 if (strcmp(in, result) == 0) {

 printf("Helloooooooooooooooo");

 }

谁能告诉我如何在 C 中进行这种字符串操作?

【问题讨论】:

  • char *in = "Hell"; 应该写成:const char *in = "Hell";。它指向只读内存,你不能写入它
  • if (input == s+registers[i])--> if (input.equals(s+registers[i]))
  • C 是图灵完备的语言,为什么这不可能?除了没有足够内存的情况
  • 为什么不可能?

标签: c string


【解决方案1】:

您正在尝试使用strcat 修改字符串文字。这将调用未定义的行为。在 C 中,您不能修改字符串文字。声明

char *in = "Hell"; 

等价于

char const *in = "Hell";  

如果你想修改它,那么将in 声明为一个数组

char in[6] = "Hell";  

推荐阅读:c-faq: Question 1.32.

【讨论】:

  • 他没有修改字符串文字,他修改了一个常量字符串。修改字符串文字(或至少尝试 ^^)将是 strcat("hell", "o")
  • @maxdev;字符串字面量和常量字符串有什么区别?
  • @maxdev;我在标准中没有找到术语字符串常量
  • @maxdev 不,他修改了字符串文字。这里不涉及常量字符串(字符串文字不是常量,但它们是只读的)。
  • @maxdev: 好的,让我们结束这个来回的语义争论:C 标准没有提到常量字符串,但有一节题为:6.4.5 字符串文字乙>。让我们遵守标准,并同意我们在这里讨论的是字符串文字
【解决方案2】:

你可以试试这个:

const char *input = "addl $1,%eax";  // For testing the code

char *registers[] = {"eax", "abx", "ebx", "edx"}; 
const char *s = "addl $1,%";
char temp[30];   // temp array to store possible commands in complete form

for (int i = 0 ; i < 4; i++) {
    strcpy(temp, s);  // Copy the common part to `temp`
    if (strcmp(input, strcat(temp, registers[i])) == 0) 
          // Compare the input string with possible command string
    {
        printf("Match");
        // write out optimized code with specified register
    }
}

你可以阅读更多关于strcpystrcmpstrcathere的信息

【讨论】:

    【解决方案3】:

    您在in 上调用strcat,它是一个指向不可变字符串文字(只读内存中的字符数组)的指针。根据定义,您不能将任何其他字符连接到该数组。

    我已经更详细地解释了这个现象here

    就像在链接的问题中一样,您可以通过将char *in 定义为字符数组来解决这个问题:

    char in[MAX_IN_LEN] = "Hell";
    

    将字符串文字中的字符复制到字符数组中。然后,只要数组足够大,就可以随意拼接。

    【讨论】:

      【解决方案4】:

      以下两个语句在 C 中是不同的。

      char *in1 = "Hello";
      char in2[6] = "Hello";
      

      在第一条语句中,字符指针in1 指向字符串文字Hello。在这里您不能更改字符串文字。 但在第二个语句中,您将字符串Hello 存储在字符数组in2 中。 这可以修改为 in2[0] = 'h'; 之类的其他内容

      【讨论】:

        【解决方案5】:

        问题是您试图将一个字符串连接到一个常量字符串。不能修改常量字符串。

        在声明char* test = "My string" 时,编译器会自动生成变量const,因为字符串文字是代码中const char* 的表示。

        strcat 想要一个 char*,它包含一个以 null 结尾的字符串,并且有足够的空间来连接第二个参数。要正确解决该问题,您必须将第一部分复制到缓冲区,然后将附录连接到该缓冲区,如下所示:

        const char* source = "Hello ";
        const char* appendix = "world!";
        
        uint32_t bufLen = strlen(source) + strLen(appendix) + 1; // length of both + null-termination
        char buf[bufLen];
        strcpy(buf, source);
        strcat(buf, appendix);
        // now buf contains your concatenated string
        

        【讨论】:

        • 这个术语 constant string 来自哪里?可以引用 C 标准吗?
        • 这不是c标准中的一个词,我只是用它来描述问题。
        • test 不是 const,它指向的字符也不是。字符串文字不是const char * 的表示,甚至不是很接近。字符串文字是非常量 chararray ,写入它是未定义的行为。
        • 还有size_t在这里比uint32_t更有意义
        猜你喜欢
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多