如何将确定的字符数与另一个字符串连接在一起?

时间:2018-07-15 17:44:57

标签: c string

我是编程新手,我正在尝试制作一个可以将确定数量的字符连接到另一个字符串的函数。它正确地计算了字符数,但是却不会显示出任务所希望的那样。 任何人都可以解释我为什么?

一个例子是(预期输出):

字符串1:测试

字符串2:字符串

N:4(要求用户输入值)

结果:TestingStri

到目前为止,我的代码是:

const getElementDims = (node, id) => {
  this.setState(previousState => {
    const taskDims = {...previousState.taskDims};
    taskDims[id] = node.getBoundingClientRect();
    return { taskDims };
  });
}

错误(实际)输出:

#include <stdio.h>
#include <stdlib.h> 
#include <string.h>
void ConcatenateString(char *string, char *string2); 
int main() 
{ 

   char string[100]; 
   char string2[100]; 

   ConcatenateString(string, string2);
   DisplayStrings(string, string2); 

} 
void ConcatenateString(char *string, char *string2)
{
    int N;
    system("cls");
    printf ("First string: ");
    gets(string);
    fflush(stdin);
    printf ("Second string: ");
    gets(string2);
    printf("Number of characters: ");
    scanf ("%d", &N);

    int i;
    int count = 0;
    for(i=0;string2[i];i++)
    {
        count++;
    }

    while (count < N)
    {
        string2[count++] = string2[i];
    }   
    strcat(string,string2); 
}
void DisplayStrings(char *string, char *string2)
{
    printf("\nFirst String:\n");
    printf("%s\n", string);
    printf("\nSecond String:\n");
    printf("%s\n", string2);

}

实际上并没有显示我要求的字符串2中的4个字符。

3 个答案:

答案 0 :(得分:1)

for(i=0;string2[i];i++)
{
    count++;
}

此代码计算string2中的字节数。我想您想在这里string


while (count < N)
{
    string2[count++] = string2[i];
}   

此代码将string2中的内容从一个地方复制到另一个地方。我认为您想从string2复制到string


strcat(string,string2); 

此代码将stringstring2连接在一起。您绝对不需要这个;它只会在您显示结果时使您感到困惑。

答案 1 :(得分:1)

您正在阅读哪本书?

您的普遍错误是不读书的人口的普遍错误。也就是说,根据我的观察,那些读书的人没有这类问题...

  • system("cls");当您从一本好书中学习时毫无意义,因为它违背了它应教的课程目的:使用最合适的工具完成工作,并且如果您想清除屏幕,该工具是除控制台之外的用户界面。不要清除控制台,当然也不要使用cls
  • 旧书仍在使用gets,但已不建议使用。考虑改用fgets
  • You should never fflush(stdin)。请注意,在将不以fflush(stdout)结尾的数据写入'\n'时,您应该使用stdout
  • int n = scanf(...);确保您选中n ...,而不仅仅是猜测;阅读the manual
int i;
int count = 0;
for(i=0;string2[i];i++)
{
    count++;
}

由于counti都同步递增并从0开始,因此它们在此处都等于strlen(string2)。您应该只在该注释上写count = strlen(string2); ...,这些变量应该是size_t,而不是int


while (count < N)
{
    string2[count++] = string2[i];
}

这是不确定的行为,至少对于N大于string2的值而言。本质上是memset(string2 + count, '\0', N - count);也就是说,您在这里所做的只是将数组末尾的字节清零。您不需要此代码。摆脱它。在火中燃烧!


fgets(string, sizeof string, stdin);
fgets(string2, sizeof string2, stdin);
strcat(string,string2);

啊,你为什么不这样做呢?不要忘记删除换行符...

答案 2 :(得分:1)

正如其他人告诉您的那样,切勿使用gets(),因为它的安全性问题臭名昭著。阅读this

像使用fgets()

char str[100];
fgets(str, 100, stdin);

您可以检查fgets()返回的值,看是否一切顺利。错误返回NULL

fgets()也将读入结尾的\n。您可以像删除它

size_t l=strlen(str);
if(str[l-1]=='\n')
{
    str[l-1]='\0';
}

\n替换为\0,表示字符串的结尾。


要将字符串n的{​​{1}}个字符连接到str2(假设str1有足够的空间。执行此操作时必须检查溢出),你可以做

str1

sprintf(str1, "%s%.*s", str1, n, str2); 的值将代表格式字符串中的n。因此,如果*n,它将是4,这意味着相应字符串中的前%.4s个字符。

在执行此操作之前,请检查4是否有足够的空间,例如

str1

请参阅this帖子,以了解为什么if(strlen(str1)+n+1 < 100)// where 100 is the size of the character array str1 { sprintf(......);//the sprintf() call } 被认为不好。

然后用this看为什么更好地避免使用fflush(stdin)