使用指针打印输出值

时间:2011-09-12 00:25:54

标签: c segmentation-fault strcmp

我有一些不确定数量的变量及其计数的排序数组。我需要像这样构建一个字符串:

Attribute[0]: p=2, e=8

我的问题是数组实际上是一个指针,我不想使用固定长度的循环,所以我看到的唯一解决方案是使用数组指针。

void printArray(Node_ptr node){
    int count=0; //character count
    char *temp= node->attributes; //duplicate attribute array

    char cur; //current char
    char *outputCat= emalloc(150); //concatenate counts to a single string

    strcpy(outputCat, "Attribute %d counts are: ");
    qsort(temp, lineCount, sizeof(char), compare); //sort the array

    while ((temp) != NULL){
        cur= *temp;
        ++temp;
        if (strcmp(&cur, temp)==0) //if characters are same
            count++; 
        else { //build reporting string
            strcat(outputCat, &cur);
            strcat(outputCat, "= ");
            sprintf(outputCat, "%d  ", count);
            count=0;
        }
    }
    free(outputCat);
}

这里的问题是strcmp(&cur, ++temp)==0每次都返回false,即使我在调试器中看到它们的值。因此,else条件不断被构建并在多次迭代后抛出段错误。

两个问题:

1-即使输入相同的值,什么可以使strcmp返回非零值? 2-如何修复代码?

1 个答案:

答案 0 :(得分:2)

在你的行中:

strcmp(&cur, temp)

cur是在本地声明的char,因此,&cur只是堆栈中的某个位置,在此上下文中没有任何意义。

我认为您的意思是检查当前字符cur是否与下一个字符*temp相同。
这看起来像:

if (cur == *temp) //if characters are same
    count++; 

接下来,我将大量简化您的输出部分:

sprintf(outputCat, "%c = %d", *cur, count);  // e.g.   "e = 8"
count=0;

最后,我怀疑你的循环将会终止,因为它继续temp++,而temp != NULL。我相信你打算检查存储在指针{{}的VALUE 1}}。
应该针对'\ 0'正确检查temp,而不是NULL (\ 0和NULL碰巧具有相同的值,但它们应该在语义上被视为相同)

*temp

P.S。您的简单但优秀的评论“//如果字符相同”对我理解您的代码非常有帮助。这是一个很好的案例,简短而有意义的评论 INVALUABLE 。谢谢。


(希望最后编辑)
总的来说,我推荐的变化如下:

while (*temp != '\0'){

这对你有用吗?