Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 程序返回一些奇怪且不完整的字符串_C_Arrays_String_Algorithm - Fatal编程技术网

C 程序返回一些奇怪且不完整的字符串

C 程序返回一些奇怪且不完整的字符串,c,arrays,string,algorithm,C,Arrays,String,Algorithm,我试图编写一个函数,从字符串中删除空格,但输出结果根本不合理。我需要帮助,法姆 代码: char*deleteSpace(char*String,int-n){ int i; 字符*没有空格; withoutSpaces=calloc(n,sizeof(char)); 对于(i=0;i

我试图编写一个函数,从字符串中删除空格,但输出结果根本不合理。我需要帮助,法姆

代码:

char*deleteSpace(char*String,int-n){
int i;
字符*没有空格;
withoutSpaces=calloc(n,sizeof(char));
对于(i=0;i
您需要为源字符串的“读取”索引和目标字符串的“写入”索引编制索引

另外,为了更好的可调试性和可读性,将索引增量,
++i
放在单独的一行上。哦-看起来你在两次递增
i
。一次通过循环隐式执行,另一次使用
++i

还不清楚n是否表示带或不带null终止符的字符串长度。让我们让函数通过strlen解决这个问题

不要忘记使用null终止输出字符串

还有其他几个bug。这是一个改进的版本:

char* deleteSpace(const char *String) {

    int j = 0;
    const char* ptr = String;
    size_t n = 0;
    size_t spaces = 0;
    char* withoutSpaces = NULL;

    // count how many characters we expect to copy over
    while (*ptr) {
        n += (*ptr == ' ') ? 0 : 1;
        ptr++;
    }

    withoutSpaces = (char*)malloc(n+1); // +1 for null char

    for (i = 0; i < n; i++) {
        if (String[i] != ' ') {
            withoutSpaces[j] = String[i];
            j++;
        }
    }

    withoutSpaces[j] = '\0';

    return withoutSpaces;
}

对不带空格的
字符串使用两个单独的计数器。当你
++i
没有空格的
的索引跳过一个单元格。为了进一步,你可以
realloc
结尾的
没有空格的
字符串为
没有空格的=realloc(没有空格,j+1)
。并确保在返回时
释放
此内存。@RahulBharadwaj-似乎OP想要返回一个新字符串。因此,由调用方释放字符串。我将添加一个符合您建议的紧凑版本。正确,
免费
取决于OP.@RahulBharadwaj-通过您建议的变体进行修复。
void deleteSpace(char *String) {
    char* ptrWrite = String;
    while (*String) {
        if (*String != ' ') {
            *ptrWrite = *String;
            ptrWrite++;
        }
        String++;
    }
    *ptrWrite = '\0';
}