【问题标题】:nested loop in C does not workC中的嵌套循环不起作用
【发布时间】:2014-11-30 18:50:56
【问题描述】:

我正在尝试使这个嵌套循环工作..由于某种原因,代码没有进入第二个循环..它一直要求输入一个字母,所以它没有进入带有 k 计数器的代码......并要求我输入一个字母 10 次

谢谢。

 char letter;
 int proposition;
 int i,k;
 char dashes[50];
 proposition=10;
 for (i=0;i<proposition;i++){
    printf("enter letter to guess %s\n");
    scanf("%s", &letter);
     for(k=0;k<ret;k++){
        if (tab[k] == letter){
            dashes[k]= letter;
            printf("%s\n", dashes);
        }
    }
  }

【问题讨论】:

  • 你在哪里定义用于内部循环比较的ret
  • k中ret的值是多少
  • ret 被初始化为字符串的长度。我以前输入的。并使用以下函数获取长度。 int string_lenght(char t[]){ int j; j=0; while (t[j] != '\0'){ j++; } return j; }

标签: c loops for-loop nested


【解决方案1】:

scanf("%s", &amp;letter);

问题是,你要求一个字符串,将它传递给一个地址。你要么想做

scanf("%c", &amp;letter);或将其更改为int getchar( void );

编辑#1:

我建议不要使用int scanf (const char * format, ...);。有关更多信息,您可以在此处阅读 Disadvantages of scanf.

编辑#2:

scanf("%s", letter); 在技术上是可行的,但是,因为您只要求一个字母,所以这样做是错误的。另请记住,字符串以\0 结尾,因此请务必为它预留空间。

【讨论】:

    【解决方案2】:

    试试这个

    char letter[2];
    int proposition;
    int i,k;
    char dashes[50]={0};
    memset(dashes, '-', strlen(tab));
    proposition=10;
    for (i=0;i<proposition;i++){
       printf("enter letter to guess %%s\n");
       scanf("%1s", letter);
        for(k=0;k<ret;k++){
           if (tab[k] == *letter){
               dashes[k]= *letter;
               printf("%s\n", dashes);
           }
       }
     }
    

    可能是样本

    #include <stdio.h>
    #include <string.h>
    
    int main(void){
        char *tab = "foobar";
        int ret = strlen(tab);
        char letter[2];
        int proposition;
        int i,k, match=0;
        char dashes[50]={0};
        memset(dashes, '-', ret);
        proposition=10;
        for (i=0;i<proposition;i++){
            if(match == ret)
                break;
            printf("enter letter to guess\n");
            scanf("%s", letter);
            for(k=0;k<ret;k++){
                if (tab[k] == *letter){
                    dashes[k]= *letter;
                    ++match;
                }
            }
            printf("%s\n", dashes);
        }
        return 0;
    }
    

    【讨论】:

    • 我需要初始化破折号以仅显示“-”,因此我输入了一个转到选项卡变量的字符串。例如,我进入世界 foobar 变量选项卡将是 foobar。变量破折号将显示“-----”然后我输入一个字母,如果该字母与变量选项卡中的一个字符匹配,我将其替换为变量破折号。例如,我输入 o 然后变量破折号变成 -oo--。
    • @danidar 通过memset 初始化dashes
    • 我这样做是为了将字符串初始化为 - : for (k=0;k&lt;ret;k++){ dashes[k]='-'; } 然后循环将在找到破折号时将它们替换为真实字符..
    【解决方案3】:

    问题似乎与您的 ret 变量有关。
    如果你还没有初始化它,值将是未定义的,你将不知道循环条件是否为true

    【讨论】:

      【解决方案4】:

      使用 %c 代替 %s。

      %s 是让字符串直到空格字符。所以这就是它询问的原因 来自用户的十个字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-02
        • 2017-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多