C:函数未返回完整字符串

时间:2015-11-28 18:41:31

标签: c arrays string

我不确定我是不是真的很笨,但我所做的这个功能应该从一个数组中取出字符并选择性地将它们放在另一个数组中以删除空格和标点符号等内容。但是,返回的东西似乎只是第一个char(来自printf)。

char * getWord(char *array) {
    char *temp = malloc(sizeof(char) * 20);
    int i= 0;
    while(i < 20) {
        if(validChar(array[i])) {
            printf("pass 1 - %c\n", array[i]);
            temp[i] = array[i];
            printf("pass 2 - %c\n", temp[i]);
            i=i+1;
        }
        else {
            i=i+1;
       }
    }
    printf("%s\n", temp);
    return temp;
}

validChar函数:

bool validChar(char given) {
    char a[]=". ,;:*!?'-\n\r";
    for(int q = 0; q <=12; q++) {
        if(given == a[q]){
            return false;
        }
    }
    return true;
}

在每个&#34;传递2&#34;中,显示正确的打印,以便循环按预期工作。我真正不理解的是当我删除条件以选择有效字符时,最终的打印状态按预期工作并打印整个字符串。

2 个答案:

答案 0 :(得分:1)

首先,您只在getWord中为两个字符串使用一个计数器。你必须将i字符串写入temp的字符串与另一个计数器(例如j)分开。 j只会在您向temp添加一些字符时才会增加。

最后,您在'\0' temp之前错过了printf的结尾getWord

答案 1 :(得分:1)

每个阵列需要两个计数器。您已用于i的计数器array和将用于临时的新j

    if(validChar(array[i])) {
        printf("pass 1 - %c\n", array[i]);
        temp[j] = array[i];
        printf("pass 2 - %c\n", temp[j]);
        i=i+1;
        j=j+1;
    }
    else {
        i=i+1;
   }

您只打印第一个字符的原因是您从malloc获得的内存恰好包含设置为零的字节。在temp中跳过的第一个字符包含一个零字节,因为字符串是零终止的,这就是你打印出来的所有字符。

从技术上讲,这些零字节未初始化,因此代码的行为未定义。

复制完成后,代码也不会将字符串temp置零。在while循环之后的位置'\0'添加tempj的赋值,并将while循环条件从20更改为19(或再分配一个字节),因此零终结符赢了不会被写出来。