【问题标题】:Spaces not being replaced with newlines空格没有被换行符替换
【发布时间】:2018-02-05 04:59:19
【问题描述】:

我正在处理一个项目,需要使用一些规则拆分 (*char) 字符串。它们是每 7 个空格用换行符 \n 替换空格。这样做四次。之后用换行符替换每 6 个空格并执行四次。

前:

JD 2D 9H JC 5D 7H 7C 5H KD KC 9S 5S AD QC KH 3H 2S KS 9D QD JS AS AH 3C 4C 5C 10S QH 4H AC 4D 7S 3S 10D 4S 10H 8H 2C JH 7D 6D 8S 8D QS 6C 3D 8C 10C 6S 9C 2H 6H

结束

JD 2D 9H JC 5D 7H 7C
5H KD KC 9S 5S AD QC
KH 3H 2S KS 9D QD JS
AS AH 3C 4C 5C 10S QH
4H AC 4D 7S 3S 10D
4S 10H 8H 2C JH 7D
6D 8S 8D QS 6C 3D
8C 10C 6S 9C 2H 6H

代码(为了简单起见,我将其缩短并删除了其他 7 个文件和代码的开头。)

    state_t ret;

    int s,c;
    char * str;
    card_t card;
    char * sta;
    state_init(&ret);
    sta = string;
    str = string;
   int aoc=0;
    int ao=0;
   for(int a=0;(*sta)!='\n'; a++)
   {
        if((*sta)!=' ')
        {
            sta++;
            str++;
        }else
        {
            aoc++;
        }
        if(aoc==7&&ao<=4)
        {

            aoc=0;
            ao++;
            *str='\n';


        }
        else if(aoc==6&&ao>=4)
        {

            aoc=0;
            ao++;
            *str='\n';

        }
        if((*str)=='\n')
        {
            break;
        }
   }
   printf(str);

代码继续,但这是错误点(我知道,因为没有该代码和预先格式化的输入,代码每次都有效)。代码根本不做任何事情,没有实际的错误,字符串也根本没有改变。

MVCE:

   void f(char*s,char*toString)
{
    char c,i=0,j=0;
    int num=0;
    while(c=*(s++))
        { 
            
            toString[num]=c; 
          //  putchar(c);
            if(c==' ')++i;
            if((j<4&&i==7)||(j>=4&&i==6))
                {
                    i=0;
                    ++j;
                    toString[num]='\n';
                   // putchar('\n');
                    
                } 
                num++;
        }
}

我一直在解决这个问题,但找不到问题所在。非常感谢任何帮助。

为什么代码运行时没有用换行符替换空格?

【问题讨论】:

  • 那么,您是否在调试器中单步执行了代码?
  • 不编译就不是MCVE。
  • @OldProgrammer 没有。
  • @MarkTolonen 我加了一个
  • 一个 MCVE 并不意味着是“绝对最少的字符数”——把它全部放在一行上是非常无益的。关键是要尽量减少没有任何无关代码 - 但仍然尽可能可读。问问自己,如果您试图回答这个问题,想要阅读什么代码。你想看44行不完整的版本吗?可能不是。您想阅读单行代码吗?可能不是。那么为什么不提供你想读的代码呢?

标签: c debugging replace


【解决方案1】:

欢迎来到 C!你没有分配内存,所以你出错了。使用malloc 分配内存。我已经制作了适合您的代码:

void f(char*s,char*toString)
{
    char c,i=0,j=0;
    int num=0;
    while(c=*(s++))
        { 

            toString[num]=c; 
          //  putchar(c);
            if(c==' ')++i;
            if((j<4&&i==7)||(j>=4&&i==6))
                {
                    i=0;
                    ++j;
                    toString[num]='\n';
                   // putchar('\n');

                } 
                num++;
        }
}

state_t initial_user_state_to_c(char * string)
{
    char * sting;
    sting = malloc(200);
    state_t ret;
    int s,c;
    char * str;
    str = string;
    card_t card;
    state_init(&ret);
    f(str,sting);
    str = sting;
    for(s=0;s<8;s++)
    {
        /* Move to the next stack */
        if (s!=0)
        {
            while((*str) != '\n')
            {
                str++;
            }
            str++;
        }


        for(c=0;;c++)
        {
            /* Move to the next card */
            if (c!=0)
            {
                while(((*str) != ' ') && ((*str) != '\n'))
                {
                    str++;
                }
                if (*str == '\n')
                {
                    break;
                }
                str++;              
            }

            card = card_user2perl(str);
            push_card_into_stack(ret, s, card);
        }        
    }

    return ret;
}

问题是您根本没有分配内存。在 C 中必须使用 malloc 分配内存。您尝试使用在高级语言中发现的几种技巧。 C 不会为你管理你的记忆......永远......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多