【问题标题】:Assigned Value to a Counter by Another, Prevents Counter from Incrementing?另一个给计数器赋值,防止计数器增加?
【发布时间】:2026-02-01 11:40:02
【问题描述】:

这是我的简单 C 代码:

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

int i, j, k;

void main(){
    int limit=10;
    char txt[]="This text would be cut, according to limit";
    clrscr();
    for(i; i<strlen(txt); i++){
        if(txt[i] == 32) k=i;
        if(i!=0 && i%limit == 0){
            if(txt[i] != 32) i=k;// This is what bugs the program
            while(j<i) printf("%c",txt[j++]);
            printf("\n");
            }
        }
    getch();
}

我的程序做了什么:

  • 它通过递增计数变量到一定的限制
  • 如果当前字符是空格(ASCII 32),则将i的索引复制到k
  • 如果索引达到限制,它将启动以下操作:
    • 如果最后一个字符不是空格,它会将i 设置为通过k 的最后一个空格的索引
    • 它将打印从j 中使用的最后一个索引到i 的所有字符,顺便说一下,只到最后一个空格
    • 它将创建一个新行
  • 最后,它从最后一个索引i 继续循环,循环后必须递增

通过调试模式,我发现打印第一行后,i 保持在k 设置的值,并创建了一个无限循环...... 我真的不知道为什么...


对于那些询问我期望什么输出的人来说,例如,我有字符串

"This text would be cut, according to limit" 

这将限制为每行十个字符,但如果最后一个字符不是空格,它只会在第一行打印未溢出的单词,然后继续执行此操作直到字符串结束,这样做的目的是保存时间,而不是手动计算字符串,然后在每个限制处添加 \n

示例输出:

This text 
would be 
cut, 
according
 to limit

【问题讨论】:

  • 你想通过改变循环内的循环计数器来达到什么目的?
  • 请不要使用 ASCII 值作为魔术常量。 C 有' ' 表示一个空格。
  • 你期望什么输出?

标签: c loops indexing


【解决方案1】:

我这样修改了你的代码:

void PrintText(const char txt[])
{
    if (j<i) {
        while(j<i) printf("%c",txt[j++]);
        printf("\n");
        }
}

void PrintText_StripLeft(const char txt[])
{
    for (; (j < i) && (32 == txt[j]); ++j);
    PrintText(txt);
}

main:

for(i; i<strlen(txt); i++){
    if(txt[i] == 32) k=i;
    if(i!=0 && (i-j)%limit == 0){
        if(txt[i] != 32 && k){i=k;k=0;}
        PrintText_StripLeft(txt);
        }
    }

PrintText_StripLeft(txt);

变化:

  1. (i-j)%limit :因为你想要另一个 limit 字符

  2. if(txt[i] != 32 &amp;&amp; k) {i=k;k=0;} : 你不想回到同一个索引

  3. 最后两行打印剩余的字符串

编辑您必须决定如何处理空格,您的解决方案(i 分配给k 之后的else ++i 似乎不起作用),所以我添加了两个@987654330 @函数:第二个去掉了行首的空格,但是你会丢失这样的字符!

【讨论】:

  • 非常感谢,您甚至添加了我稍后要打扰的剩余字符串...
  • 我添加了另一个验证,if (j&lt;i),以避免打印空行。
  • 还有一点,我为什么要使用if(txt[i] != 32 &amp;&amp; k)?我尝试删除&amp;&amp; k,但出现错误。
  • k 比较对于避免返回到相同的 k 值是必要的:这就是为什么它在分配后重置 (k=0;)。这发生在比限制更长的词上,比如“自动”。
  • 您的else ++i; 解决方案似乎在没有else 的情况下也能工作:如果我们总是递增的话。
【解决方案2】:

你不应该初始化 i、j、k 吗?

【讨论】:

  • 不,它们是全局变量。
  • 是的,它们是全局变量