【问题标题】:how can i concatenate determined number of characters with another string?如何将确定数量的字符与另一个字符串连接起来?
【发布时间】:2018-07-15 17:44:56
【问题描述】:

我是编程新手,我正在尝试制作一个可以将确定数量的字符连接到另一个字符串的函数。它正在正确计算字符数,但不会像任务想要的那样显示。 谁能解释一下为什么?

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

字符串 1:测试

字符串 2:字符串

N: 4(向用户询问值)

结果:TestingStri

到目前为止我的代码是这样的:

#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);

}

错误的(实际)输出:

String 1: Testing
String 2: String
N: 4
Output: TestingString

它并没有真正显示我要求的字符串 2(例如)中的 4 个字符。

【问题讨论】:

    标签: c string


    【解决方案1】:
    for(i=0;string2[i];i++)
    {
        count++;
    }
    

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


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

    此代码将string2 中的内容从一处复制到另一处。我想你想从string2 复制到string


    strcat(string,string2); 
    

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

    【讨论】:

    • 终止'\0'。
    【解决方案2】:

    正如其他人告诉你的那样,永远不要使用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,表示字符串结束。


    要将字符串str2n 字符连接到str1(假设str1 有足够的空间。执行此操作时必须进行溢出检查),您可以这样做

    sprintf(str1, "%s%.*s", str1, n, str2);
    

    n 的值将代替格式字符串中的*。因此,如果n4,它将是%.4s,这意味着相应字符串中的第一个4 字符。

    在执行此操作之前,请检查 str1 是否有足够的空间放置类似的东西

    if(strlen(str1)+n+1 < 100)// where 100 is the size of the character array str1
    {
        sprintf(......);//the sprintf() call
    }
    

    查看this 的帖子,了解为什么fflush(stdin) 被认为不好。

    this 看看为什么最好避免使用system()

    【讨论】:

    • @snr 你用的是哪个编译器?
    • @snr 你是什么意思?
    【解决方案3】:

    你在看哪本书?

    您所犯的普遍错误对于不读书的人群来说很常见。也就是说,在我的观察中,看书的人不存在这样的问题……

    • system("cls"); 当你从一本好书中学习时毫无意义,因为它违背了它应该教授的课程的目的:使用最适合工作的工具,如果你想清除屏幕该工具是 用户界面,而不是 控制台。不要清除控制台,当然也不要使用cls 这样做。考虑使用 Unix 的任何人(因此不存在 cls 命令);最好的情况是您的代码会显示错误,最坏的情况是 cls 可能是恶意程序。
    • 旧书仍在使用gets,但已被弃用。考虑改用fgets
    • You should never fflush(stdin)。请注意,当您将不以'\n' 结尾的数据写入stdout 时,您可能应该fflush(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];
    }
    

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


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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 2017-04-17
      • 2022-08-04
      • 2017-05-30
      • 2020-10-01
      相关资源
      最近更新 更多