【问题标题】:C: Function not returning full stringC:函数未返回完整字符串
【发布时间】:2015-11-28 18:41:30
【问题描述】:

我不确定我是不是真的很笨,但是我创建的这个函数应该从一个数组中获取字符并有选择地将它们放入另一个数组中以删除空格和标点符号等内容。然而,返回的似乎只是第一个字符(来自 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;
}

在每个“pass 2”中,都会显示正确的打印,因此循环按预期工作。我真正不明白的是,当我删除条件以选择有效字符时,最终的打印语句按预期工作并打印整个字符串。

【问题讨论】:

  • validChar 中的 for 循环不应该只运行到 11 吗?
  • “但是,返回的似乎只是第一个字符(来自 printf)。” - 哦真的吗?显示重现此行为的代码。

标签: c arrays string


【解决方案1】:

首先,您只对getWord 中的两个字符串使用了一个计数器。您必须将字符串的读取与i 分开,将temp 字符串的写入与另一个计数器分开,例如jj 只会在您实际向 temp 添加一些字符时递增。

最后,您在getWord 中的printf 之前缺少temp 的结尾'\0'

【讨论】:

    【解决方案2】:

    每个数组需要两个计数器。计数器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循环后的位置j处添加'\0'temp的赋值,并将while循环条件从20改为19(或多分配一个字节),这样零终止符就不会被写出界限。

    【讨论】:

      猜你喜欢
      • 2014-04-04
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2016-04-30
      • 2014-11-06
      • 1970-01-01
      相关资源
      最近更新 更多