簡體   English   中英

將兩個字符串連接成一個的麻煩

[英]Trouble with with concatenating two strings in to one

我需要編寫一個將兩個字符串連接到第一個字符串的程序。 我不能使用第三個參數來保存新字符串。 當我運行該程序時,沒有任何輸出,因此,我很確定問題出在連接兩個字符串的函數中。

#include <stdio.h>

#define MAX_SZ 81

int concatString(char s1[], char s2[]); // concatenates s2 onto s1, returns length of s1
int getString(char c[], int len);

main(void)
{
    char array1[MAX_SZ * 2];
    char array2[MAX_SZ];
    int string1 = 0;
    int string2 = 0;
    int concat = 0;

    printf("Please String # 1 up to 80 characters long:\n");
    string1 = getString(array1, MAX_SZ);
    printf("Please enter String #2 up to 80 characters long:\n");
    string2 = getString(array2, MAX_SZ);

    concat = concatString(array1, array2);

    printf("You entered \"%s\" (length = %i)\n", array1, concat);

    return 0;
}

int getString(char c[], int len)
{
    int i = 0;
    char d = 0;
    while (d != '\n' && i < len)
    {
        d = getchar();
        c[i++] = d;
    }

    c[--i] = '\0';
    return (i);
}

int concatString(char s1[], char s2[])
{
  int i, j;

  for (i = 0; s1 != '\0'; ++i)
    s1[i] = s1[i];

  for (j = i; s2 != '\0'; ++j)
    s1[j] = s2[j];

  s1 [i + j] = '\0';
  return (i + j);
}

問題出在以下幾行:

for (j = i; s2 != '\0'; ++j)
  s1[j] = s2[j];

這里j不為零,因此您將在s2中以非零索引開始索引,甚至可能超出范圍。

但這只是一個問題。 第二個問題是循環的條件,它永遠不會是錯誤的,從而導致無限循環。

第一個循環的循環條件存在相同的問題。

至於為什么循環條件錯誤,字符'\\0'等於零,這在大多數系統上也等於NULL 因此,您正在有效地檢查是否s1 != NULL 由於兩個字符串都是編譯時數組,因此傳遞給函數的指針將永遠不會為空指針。

有幾個問題,主要是與for循環中的條件有關:

for (i = 0; s1 != '\0'; ++i)

除非字符串為null,否則永遠不會為true。

您要輸入的是

for (i = 0; s1[i] != '\0'; ++i)

這將檢查您正在查看的字符是否為空終止字符,這可能就是您想要的。

第二個循環也是一個問題。

for (j = i; s2 != '\0'; ++j)
s1[j] = s2[j];

您是從j開始而不是從s2開始

for (j = 0; s2[j] != '\0'; ++j)
s1[i + j] = s2[j];

這將引導您完成s2,將s2 [0]添加到s1 [i],其中s1 [i]是最后一個for循環中的空字符。 然后遞增j,然后s1 [i + 1]變成s2 [1],依此類推。

另外:

可以通過以下方式添加空字符(可能):

for (j = 0; s2[j-1] != '\0'; ++j)
s1[i + j] = s2[j];

如果您肯定知道s2之前的字符不為null,則可以通過聲明:

char array1[MAX_SZ * 2];
char placeholder = 0xff
char array2[MAX_SZ];

如果那沒有意義,也請忽略它,並以之前的方式附加null char

暫無
暫無

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

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