【问题标题】:C string concatenationC 字符串连接
【发布时间】:2010-10-20 13:59:06
【问题描述】:

我正在尝试在 C 中输入 2 个字符串,并输出第 3 个字符串,它是字符串 1 和 2 的连接。

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

/*
 * 
 */
int main(int argc, char** argv) {

    char stringarray1 [30];
    char stringarray2 [30];
    char stringarray3 [30];

    int length;

    printf("Please enter some text less than 30 characters long\n");
    scanf("%[a-z, ]", &stringarray1);

    printf("Please enter some text less than 30 characters long\n");
    scanf("%[a-z, ]", &stringarray2);

    strcat(stringarray1, stringarray2);


    //length = strlen(stringarray);
    printf("The combined string is %s\n", stringarray1);


    return (EXIT_SUCCESS);
}

它允许我输入第一个字符串,然后打印第二个和第三个 printf 语句,不允许我输入第二个字符串。

如何在不退出的情况下输入第二个字符串?为什么会退出?

【问题讨论】:

  • 注意你的数组大小,因为两个 20 个字符的输入会溢出你的 char 数组。

标签: c string concatenation


【解决方案1】:

查看scanf 的文档:您的格式字符串"%[a-z, ]" 不像您想象的那样。只需将 "%s" 用于字符串即可。 (没有任何字符检查)。

【讨论】:

  • 或者,更好的是,使用fgets。如果你坚持scanf一定要避免缓冲区溢出
  • 对于玩具项目/家庭作业,他可能不必太担心haxxors。不过,这是一个好习惯。
【解决方案2】:

您不应该为已经是指针的数组添加 &。

scanf("%[a-z, ]", stringarray2);

【讨论】:

  • 这不是他的全部问题,但这是一个大问题。
【解决方案3】:

我猜想,你需要在你的 scanf 规范字符串中添加一个\n。您可能还应该要求%s 而不是%[a-z, ]。您拥有它的方式将匹配单个字符,然后当第二个 scanf 被击中时,下一个字符将匹配。

还有一些安全问题。您可能应该检查以确保两个字符串一起不大于 30 个字符。正如 Benoit 所指出的,C 中的数组还兼作指向第一个字符的指针,因此在将它们传递给 C IO 例程时,不要对它们使用地址运算符 (&amp;)。这将为例程提供数组指针本身的地址,然后 IO 例程将用字符数据愉快地清除该地址。不好!

【讨论】:

    【解决方案4】:

    你知道 chararray 和 stringarray 的区别吗?我想不是。此外,您必须为结果字符串分配足够的空间,例如:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /*
     * 
     */
    int main(int argc, char** argv) {
    
        char chararray1 [31];
        char chararray2 [16];
        char chararray3 [30];
    
        int length;
    
        printf("Please enter some text less than 15 characters long\n");
        scanf("%15[a-z, ]", stringarray1);
    
        printf("Please enter some text less than 15 characters long\n");
        scanf("%15[a-z, ]", stringarray2);
    
        strcat(stringarray1, stringarray2);
    
    
        //length = strlen(stringarray);
        printf("The combined string is %s\n", stringarray1);
    
    
        return (EXIT_SUCCESS);
    }
    

    【讨论】:

    • stringarray 只是用户输入变量的任意名称,我承认这不是最好的名称。不过谢谢!
    【解决方案5】:

    我建议使用 fgets 而不是 scanf,您可以指定最大长度(缓冲区目标大小 - 1)并避免意外。

    目标缓冲区也应该是输入缓冲区大小的两倍,否则可能会导致内存被覆盖

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 2011-07-12
      相关资源
      最近更新 更多