簡體   English   中英

C字符串串聯

[英]C string concatenation

我試圖在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語句,而不允許我輸入第二個字符串。

如何在不退出的情況下輸入第二個字符串? 為什么退出?

看一下scanf的文檔:您的格式字符串"%[az, ]"似乎與您的想法無關。 只需對字符串使用"%s" (它沒有任何字符檢查)。

您不應將&放在已經是指針的數組中。

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

猜測一下,我想您會在scanf規范字符串中需要一個\\n 您可能還應該問%s而不是%[az, ] 您擁有單個字符的方式將匹配,然后在按下第二個scanf時,將匹配下一個字符。

還有一些安全問題。 您可能應該檢查以確保兩個字符串的總和不超過30個字符。 正如Benoit所指出的那樣,C中的數組還兼用作指向第一個字符的指針,因此在將它們傳遞給C IO例程時,不要在它們上使用地址運算符( & )。 這將為例程提供數組指針本身的地址,然后IO例程將輕松地將其與字符數據一起擦除。 不好!

您知道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);
}

我建議使用fgets而不是scanf,您可以指定最大長度(緩沖區目標大小-1)並避免出現意外情況。

目標緩沖區也應該是輸入緩沖區大小的兩倍,否則您將面臨內存覆蓋的風險

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM