能够处于条件语句中时的 C char 指针错误

C char pointer bug when being able to be in a conditional statement

我目前正在尝试使用 strtok 操作 char 指针变量。然后在条件语句中使用它根据当前指针内容附加到数组。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 48
#define sizel 10 
#define sizer 128 

void show_bits(unsigned int x[]);
void clear(unsigned int x[]);

int main(void)  {
    char line[sizel][sizer];
    unsigned int s[N];      
    unsigned int d[N];      
    unsigned int b[N];
    FILE *fp1 = NULL; 

    int i = 0;
    int tot = 0; 
    fp1 = fopen("LineEncoded.txt", "r");

    while (fgets(line[i], sizer, fp1)) {
        line[i][strlen(line[i]) - 1] = '[=10=]';
        i++;
    }

    clear(s);

    i = 0;
    char * pch;
    pch = strtok (line," ");
    
    while (pch != NULL) {
        if (pch == '0') {
            s[i]=1;
            i++;
        }
        else if (pch == "--" || pch == "++") {
            s[i]=0;
            i++;
        }
            
        pch = strtok (NULL, " ");
    }

    show_bits(s);
    return 0;
}

void show_bits(unsigned int x[]) {
    int i;
    for (i = 0; i < N; i++) {
        if (i % 32 == 0)    
            printf ("\n");

        fprintf(stdout, "%d", x[i]);
    }

    fprintf(stdout, "\n");
}

void clear(unsigned int x[]) {
    int i;
    for (i = 0; i < N; i++)
        x[i] = 0;
}

LineEncoded.txt 文件的内容是:

-- ++ 0 0 -- ++ ++ ++ 0 -- 0 0 0 0 -- 0 -- 0 -- 0 0 0 0 0 -- 0 -- ++ 0 0 -- ++ 0 0 -- ++ 0 0 -- ++ 0 0 -- ++ 0 0 --

我想做的是解码文件。我首先将文本文件内容放入一个 char 数组(称为 line),然后使用 strtok 将文本按 space 拆分,但随后我在放置 if 语句块时卡住了,因为输出结果是错误的,如下所示:

00000000000000000000000000000000
0000000000000000

我什至尝试用 for 循环替换 while 循环,但我不知道它是否真的起作用了。

以下解码输出应与此相同:

1010101110001110000001111000101010101010101010101

如有任何帮助,我们将不胜感激。谢谢

此声明

pch = strtok (line," ");

没有意义,因为数组line是一个包含字符串的二维数组。您需要将函数strtok应用于二维数组的每个元素。

还有这个 if 语句

if(pch == '0'){

没有意义,因为指针与字符“0”进行了比较。

这个if语句

else if(pch == "--" || pch == "++"){

将始终评估为逻辑错误,因为使用的字符串文字有自己的内存范围。所以他们的地址不等于pch中存储的地址。

也就是上面的if语句等价于

else if ( pch == &"--"[0] || pch == &"++"[0] ){

相反,您需要使用标准字符串函数 strcmp。

您可以使用标准字符串函数 memset 而不是函数 clear。例如

memset( s, 0, sizeof( s ) );

== 未定义用于比较字符串(或任何数组类型的内容)。

要相互比较字符串,您需要使用 strcmp 库函数:

if ( strcmp( pch, "0" ) == 0 )
{
  // handle case where token is "0"
}
else if ( strcmp( pch, "--" ) == 0 || strcmp( pch, "++" ) == 0 )
{
  // handle case where token is "++" or "--"
}

line 被定义为二维数组 - 您需要指定要标记化数组的哪一行:

pch = strtok( line[i], " " );