【问题标题】:C char pointer bug when being able to be in a conditional statement能够在条件语句中时出现 C char 指针错误
【发布时间】:2021-11-16 07:51:14
【问题描述】:

我目前正在尝试使用 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] = '\0';
        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 按空格分割文本,但是在放置 if 语句块时我卡住了,因为输出结果是错误的,如下所示:

00000000000000000000000000000000
0000000000000000

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

下面的解码输出应该等于这个:

1010101110001110000001111000101010101010101010101

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: c pointers multidimensional-array c-strings strtok


    【解决方案1】:

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

    要将字符串相互比较,您需要使用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 被定义为 2D 数组 - 您需要指定您尝试标记数组的哪一行:

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

    【讨论】:

      【解决方案2】:

      此声明

      pch = strtok (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 ) );
      

      【讨论】:

        猜你喜欢
        • 2020-06-01
        • 1970-01-01
        • 2015-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-02
        • 1970-01-01
        相关资源
        最近更新 更多