1

我用 ANSI C 编写了一个程序来删除字符串前面和结尾的双引号,所以"Hello, world"会变成Hello, world

代码:

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

char* removeQuotes(char str[]) {
    int i = 1;
    int len = strlen(str) - 2;
    char * tmp = (char*) malloc (sizeof(char) * len);
    for (;i<=len;++i ) {
        tmp[i-1] = str[i];
    }
    return tmp;
}

int main(void) {
    char str[] = "Hello, world";
    char * abc = removeQuotes(str);
    printf("Inside the quotes is: %s length: %d\n"
            "Original is: %s length: %d", abc, strlen(abc), str, strlen(str));
    return 0;
}

在 IDEOne (http://ideone.com/Iybuk) 我得到了正确的答案。但是 GCC 给了我一些奇怪的东西:

U→┬↓ length: 22es is: ello, worlESSOR_↑
Original is: Hello, world length: 12

仅当字符串包含空格时才会发生。它适用于“Helloworld”或类似的东西。有什么可靠的方法让它正常工作吗?

4

4 回答 4

5
  • 您没有为空终止符分配足够的空间。

  • 您不会将空终止符添加到结果的末尾。

  • 您的源字符串实际上不包含引号。

于 2012-04-14T23:06:56.790 回答
1

在 C 中,字符串以空字符结尾,这意味着'\0'.

您没有在 中终止字符串removeQuotes(),这是正确的版本:

char* removeQuotes(char str[]) {
    int i = 1;
    int len = strlen(str) - 2;
    char * tmp = (char*) malloc (sizeof(char) * (len + 1));
    for (;i<=len;++i ) {
        tmp[i-1] = str[i];
    }
    tmp[len] = '\0';
    return tmp;
}

此外,您的字符串实际上不包含引号,并且您不检查您传递的字符串是否removeQuotes包含任何引号。

于 2012-04-14T23:07:50.423 回答
0

在临时字符串中保留一个 '\0'。否则它不会知道它是一个字符串。

于 2012-04-14T23:08:06.687 回答
0

在您的removeQuotes函数中,您为结果字符串分配了内存不足,并在缓冲区中写入了一个额外的字符。

该字符串"Hello world"实际上不包含任何引号。您必须将其声明为"\"Hello world\""您想到的字符串。在任何情况下,由于您的引号删除产生的字符串与输入的字符数相同。你丢失了第一个字符,因为你从不复制它,最后一个字符被写入缓冲区(它会写在那里,破坏内存,即使它是一个引号。

为什么你仍然需要这样做?您是否相信 C 字符串是在字符数组的第一个和最后一个位置使用引号字符创建的?

于 2012-04-14T23:05:25.593 回答