【问题标题】:C - strcat in for loopC - for 循环中的 strcat
【发布时间】:2014-12-16 16:33:05
【问题描述】:

我正在编写一个小 C 程序,想知道为什么我在控制台中的输出是“0”、“0” [...]?我期望的输出是“ab”,“ac”,[...]。

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

int main(int argc, char *argv[])
{

  int i;
  int j;

  char string[] = "abc";
  char output[8];
  int length = size(&string[0]);

  for(i=0; i<length; i++) {
       for(j=0; j<length; j++){

       char a = string[i];
       strcat(output, &a);
       char b = string[j];
       strcat(output, &b);
       printf("%c\n", output);

       }
  }


  return 0;
}

【问题讨论】:

  • 你想要%s,而不是%c。请使用-Wall 编译以捕获此类错误。
  • 感谢您的回答。但现在它给了我: 8a♥aa♥ 8a♥aa♥a♥ba♥ 8a♥aa♥a♥ba♥a♥ca♥ 8a♥aa♥a♥ba♥a♥ca♥☺♥♥ 8a♥aa♥ a♥ba♥a♥ca♥c♥ 8a♥aa♥a♥ba♥a♥ca♥a♥
  • @askdagee 这是很多♥爱♥。别害怕,现在是圣诞节。
  • hahahahahaha :D 只是想分享爱;)
  • 你需要初始化输出 - output[0] = 0;

标签: c console-application strcat


【解决方案1】:

错误 #1。您尚未初始化 output[],因此 strcat() 将无法有效地找到要附加到的 nul 终止符。

output[0] = 0;

错误 #2。 strcat() 无论如何都不是附加字符的正确方法。

错误 #3。你的循环控制不正确。见下文。

错误 #4。您的lengthchar* 指针的大小。

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

int main(int argc, char *argv[])
{
    int i, j;
    char string[] = "abc";
    char output[8];
    int length = strlen (string);        // corrected

    for(i=0; i<length-1; i++) {          // amended loop
        for(j=i+1; j<length; j++) {      // amended loop
            output[0] = string [i];
            output[1] = string [j];
            output[2] = 0;               // string terminator
            printf("%s\n", output);      // uses string type not char
        }
    }

    return 0;
}

程序输出:

ab
ac
bc

【讨论】:

  • output 不必是 8 个元素
  • @CoolGuy 是真的,main() 也不需要参数。
  • 你错过了 #5:当没有理由相信它附近的任何地方都有“\0”时,将 &amp;a 传递给 strcat。
  • 不错的问题 +1 列表,但错误 #1 没有启用编译器警告(或不使用它们)。
  • @chux:也许我们应该称之为错误 #0。毕竟,我们是程序员。 8v)
【解决方案2】:

如果我正确理解了您要执行的操作,那么程序将如下所示

#include <stdio.h>

int main(int argc, char *argv[])
{
    char string[] = "abc";
    char output[3];
    size_t length = sizeof( string ) - 1;

    for ( size_t i = 0; i < length; i++ ) 
    {
        for ( size_t j = 0; j < length; j++ )
        {
            if ( i != j )
            {
                output[0] = string[i];
                output[1] = string[j];
                output[2] = '\0';

                puts( output );
            }
        }
    }

    return 0;
}

输出是

ab
ac
ba
bc
ca
cb

如果你的编译器不允许在循环的控制语句中声明变量,那么你可以在程序的开头声明 i 和 j。

size_t i, j;

如果您想包含“aa”之类的组合,那么您只需删除带有内部循环的 if 语句。

【讨论】:

    【解决方案3】:
       char a = string[i];
       strcat(output, &a);
    

    导致未定义的行为,因为strcat 期望在第二个参数中以空字符结尾的字符串。同样适用于:

       char b = string[j];
       strcat(output, &b);
    

    也许你打算使用:

       output[0] = a;
       output[1] = b;
       output[2] = '\0';
    

    这是更新后的for 循环:

    for(i=0; i<length; i++) {
       for(j=0; j<length; j++){
          output[0] = a;
          output[1] = b;
          output[2] = '\0';
          printf("%s\n", output);
               // ^^ use %s to print a string, not %c.
       }
    }
    

    【讨论】:

    • 您的意思是output[2] = '\0'; 而不是output[1] = '\0';
    【解决方案4】:

    如果你想使用strcat你必须知道它需要一个字符串而不是一个字符并且有一个重要的区别,当你传递&amp;astrcat认为它是一个指向字符串的指针的地址,你应该得到一个segmentation fault,这里我展示了你自己的代码,修改为使用strcat,但你并不需要它来完成这个任务。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
        int i;
        int j;
    
        char string[] = "abc";
        int length = strlen(&string[0]);
    
        for(i = 0 ; i < length ; i++)
        {
            for(j= i + 1 ; j < length ; j++)
            {
                /* initialize output to 0 more importantly to have a terminating null byte */
                char output[3] = {0}; 
                /* 
                 * create a string and initialize it with 2 char's 
                 * - the first one, the one you want to append to output
                 * - the second one is required by strcat, to mark the end of the string
                 */
                char a[2] = {string[i], 0};
                strcat(output, a);
    
                /* same as above */
                char b[2] = {string[j], 0};
                strcat(output, b);
    
                printf("%s\n", output);
            }
        }
    
    
        return 0;
    }
    

    你可以在没有strcat 的情况下做到这一点,除非你正在尝试学习如何使用strcat,这是一个没有strcat 的例子。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
        int i;
        int j;
    
        char string[] = "abc";
        int length = strlen(&string[0]);
    
        for(i = 0 ; i < length ; i++)
        {
            for(j= i + 1 ; j < length ; j++)
            {
                char output[3] = {string[i], string[j], 0}; 
                printf("%s\n", output);
            }
        }
    
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-05
      • 2022-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多