[英]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.