我在将这两个指针串连接在一起时遇到问题,下面是我的连接函数,我应该将字符串1添加到字符串2.此外,我不能在字符串库中使用任何函数,这就是这是为了通过自己编写代码来帮助我们理解函数中的代码.
char strconcat(char *user2p, char *user1p) {
while (*user2p) {
user2p++;
}
while (*user1p) {
*user2p = *user1p;
*user2p++;
*user1p++;
}
*user2p = '\0';
printf("test: %c", *user2p);
return *user2p;
}
Run Code Online (Sandbox Code Playgroud)
这是我的主要部分与功能相关.
int main() {
char userString1[21], userString2[21];
char *user1p, *user2p;
user1p = userString1;
user2p = userString2;
printf("Please enter the first string: ");
gets(userString1);
printf("Please enter the second string: ");
gets(userString2);
printf("String 1 after concatenation: ");
puts(userString1);
printf("String 2 after concatenation: %c\n", strconcat(user2p, user1p));
Run Code Online (Sandbox Code Playgroud)
终端一直给我这个,我没有包括长度和字母顺序的代码.当我尝试printf在函数中运行测试时它给了我一个null,当我返回函数时它没有给我任何东西.我很茫然,非常感谢任何帮助!
Please enter the first string: jackhammer
Please enter the second string: jacky
The length of string 1 is: 10
The length of string 2 is: 5
String 1 comes before string 2 alphabetically.
String 1 after concatenation: jackhammer
(null)
String 2 after concatenation:
Run Code Online (Sandbox Code Playgroud)
你CONCAT算法是好的,但你必须返回一个指针到原来的 [左边]值,所以你的功能需要循环之前将其保存:
char *
strconcat(char *user2p, char *user1p)
{
char *orig2p = user2p;
while (*user2p) {
user2p++;
}
while (*user1p) {
*user2p = *user1p;
user2p++;
user1p++;
}
*user2p = '\0';
printf("test: %s\n", orig2p);
return orig2p;
}
Run Code Online (Sandbox Code Playgroud)
更新:
为了给concat函数提供一个完全无懈可击的测试程序,我们可以使用[overly]大输入缓冲区并将输入长度限制为最大目标缓冲区的1/2.
gets 去掉换行,但是fgets确实没有.所以,我创建了一个xgets类似于gets但使用fgets并strchr获得[几乎]相同效果的函数.
虽然我认为使用标准字符串函数作为测试代码的一部分是可以的,但我已经创建了一个手写代码版本strchr[希望这不是你的下一个任务:-)].
无论如何,这是完整的程序:
#include <stdio.h>
char *
strconcat(char *user2p, char *user1p)
{
char *orig2p = user2p;
while (*user2p) {
user2p++;
}
while (*user1p) {
*user2p = *user1p;
*user2p++;
*user1p++;
}
*user2p = '\0';
printf("test: %s\n", orig2p);
return orig2p;
}
char *
xstrchr(char *buf,int chrwant)
{
int chrcur;
char *res = NULL;
for (chrcur = *buf++; chrcur != 0; chrcur = *buf++) {
if (chrcur == chrwant) {
res = buf - 1;
break;
}
}
return res;
}
char *
xgets(char *buf,int maxlen)
{
char *cp;
char *res;
res = fgets(buf,maxlen,stdin);
if (res != NULL) {
cp = xstrchr(buf,'\n');
if (cp != NULL)
*cp = 0;
}
return res;
}
#define MAXLEN 800
int
main(void)
{
char userString1[MAXLEN], userString2[MAXLEN + 1];
char *user1p, *user2p;
printf("Please enter the first string: ");
user1p = xgets(userString1,MAXLEN / 2);
printf("Please enter the second string: ");
user2p = xgets(userString2,MAXLEN / 2);
if ((user2p != NULL) && (user1p != NULL))
printf("String 2 after concatenation: %s\n",strconcat(user2p, user1p));
return 0;
}
Run Code Online (Sandbox Code Playgroud)