C strcmp()未按预期返回0

时间:2017-06-06 22:11:57

标签: c debugging strcmp

我一直试图让strcmp在以下程序中返回true已经很多天了,我已经阅读了strcmp,read,write的手册页...我有其他人的帖子确切地说了同样的问题。以下源代码只是一个令我感到沮丧的测试程序,有一些注释掉的行是我在使strcmp按预期工作时所做的其他尝试。我用' gdb -g'编译了并一次通过一条指令。 printf语句几乎讲述了整个故事。我无法得到buf或bufptr的值等于' t'永远。我已经简化了程序,并且只是一次一个地将一个字符打印到屏幕上,并且它们从所读取的任何文件中按预期打印,但是,一旦我开始使用strcmp,事情变得疯狂。我无法为我的生活找到一种方法,让buf中的值成为我期待它的单一字符。 当简化为write(1,...)调用时,它将预期的单个字符写入stdout,但strcmp写入单个字符“t”。永远不会返回0. !!!!!先感谢您。我原本没有在那里使用bufptr并且正在使用strcmp进行buf本身并尝试使用bufptr [0] = buf [0]并且静止不一样。

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

#define BUF_SIZE 1

void main(int argc, char *argv[])
{

    char buf[BUF_SIZE];
    int inputFd = open(argv[1], O_RDONLY);
    char tee[] = "t";
    int fff = 999;
    char bufptr[BUF_SIZE];
//  char *bufptr[BUF_SIZE];

    while (read(inputFd, buf, BUF_SIZE) > 0) {
            bufptr[0] = buf[0];
//          bufptr = buf;
            printf("********STRCMP RETURNED->%d\n", fff); // for debugging purposes
            printf("--------tee is -> %s\n", tee);        // for debugging purposes
            printf("++++++++buf is -> %s\n", buf);        // "  "   "
            printf("@@@@@@@@bufptr is -> %s", bufptr);    // "  "   "
            write (1, buf, BUF_SIZE);


            if ((fff = strcmp(tee, bufptr)) == 0)
                printf("THIS CHARACTER IS A T");
    }

    close(inputFd);

}

1 个答案:

答案 0 :(得分:2)

str - 函数族期望字符串作为输入,它是存储以空字符结尾的字符序列的数组。但是,您不在缓冲区中为空字符提供空间。要创建缓冲区字符串,您需要为空字符添加空格并将值清零,以便它们以空字符结尾。

void main(int argc, char *argv[])
{
    char buf[ BUF_SIZE + 1 ] = {0};
    int inputFd = open(argv[1], O_RDONLY);
    char tee[] = "t";

    while (read(inputFd, buf, BUF_SIZE) > 0) {
        if ( strcmp( tee, buf ) == 0 )
            printf("THIS CHARACTER IS A T");
    }

    close(inputFd);
}