C 将一个单词连接n次

C 将一个单词连接n次,c,string-concatenation,C,String Concatenation,我怎么能做这样的事 x=abc x^1=abc x^2=abcabc x^3=abcabc 我尝试在for循环中使用strcat函数,但它不起作用。 intpotw2; charw2[100]; w2=“abc”; potw2=5; 效价w2(w2,potw2); void-potentialw2(char*pal,int-potw2){ 对于(int i=0;i风格注释。在任何一种语言中使用/**/作为单行注释都是愚蠢的。@CareyGregory是的,当然,这不是讨论的好理由。程序员

我怎么能做这样的事

x=abc
x^1=abc
x^2=abcabc
x^3=abcabc
我尝试在
for
循环中使用
strcat
函数,但它不起作用。

intpotw2;
charw2[100];
w2=“abc”;
potw2=5;
效价w2(w2,potw2);

void-potentialw2(char*pal,int-potw2){
对于(int i=0;i
不要使用
strcat()
因为,我的意思是,对于已知长度的字符串的增量连接,我几乎想不出
strcat()
真的有用的情况,有些情况下,但通常情况下这会更好,例如更有效

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *pow_string(const char *const source, int times)
{
    size_t length;
    char *result;
    length = strlen(source);
    result = malloc(length * times + 1);
    if (result == NULL)
        return NULL;
    for (int index = 0 ; index < times ; ++index)
        memcpy(result + index * length, source, length);
    result[length * times] = '\0';
    return result;
}

int
input_error()
{
    fprintf(stderr, "error de entrada, ha introducido texto inválido\n");
    return -1;
}

int
main(void)
{
    char *result;
    int power;
    char word[100];
    fprintf(stdout, "Ingrese un texto (máx 99 caracteres) > ");
    if (scanf("%99[^\n]", word) != 1)
        return input_error();
    fprintf(stdout, "Cuántas veces quiere repetir la palabra ? ");
    if (scanf("%d%*[ \t]", &power) != 1)
        return input_error();
    result = pow_string(word, power);
    if (result == NULL)
        return -1;
    fprintf(stdout, "%s\n", result);
    /* free `result' which was allocated with `malloc()' */
    free(result);
    return 0;
}
#包括
#包括
#包括
字符*pow_字符串(常量字符*常量源,整数倍)
{
尺寸与长度;
字符*结果;
长度=strlen(源);
结果=malloc(长度*倍+1);
如果(结果==NULL)
返回NULL;
对于(int-index=0;index”;
if(scanf(“%99[^\n]”,word)!=1)
返回输入_错误();
fprintf(stdout,“车辆在宫殿里是否安静?”);
if(scanf(“%d%*[\t]”,&power)!=1)
返回输入_错误();
结果=功率字符串(字、功率);
如果(结果==NULL)
返回-1;
fprintf(标准输出,“%s\n”,结果);
/*使用“malloc()”分配的自由“result”*/
自由(结果);
返回0;
}
strcat()
希望目标和源不重叠。换句话说,
strcat()
的两个参数不能指向同一个内存

您需要为结果字符串分配新内存,并在循环中使用
memcpy

void potenciarw2(char *pal, int potw2)
{
    size_t len = strlen(pal);
    char* result = malloc(len * potw2 + 1); // allocate enough memory for the resulting string and null char
    if (result == NULL) {
        fputs("malloc() ha fallado", stdout);
        return;
    }

    for (int i = 0 ; i < potw2 ; i++) {
        memcpy(result + i * len, pal, len); // concatenate string using memcpy
    }

    result[len * potw2] = '\0'; // terminate with null char

    printf("La palabra es:%s\n",result);

    free(result);
}
void-potentialw2(char*pal,int-potw2)
{
尺寸长度=标准长度(pal);
char*result=malloc(len*potw2+1);//为结果字符串和空字符分配足够的内存
如果(结果==NULL){
fputs(“malloc()ha fallado”,标准值);
回来
}
对于(int i=0;i
您的函数需要稍加修改才能正常工作。修改如下:

void potenciarw2(char *pal, int potw2) {

    /* allocate some memory and copy to it*/
    char buffer[100];

    strcpy(buffer,pal);

    for (int i = 0 ; i < potw2 ; i++) {
        strcat(buffer, pal);/*now you can use strcat() safely*/
    }

    /*copy data back to pal*/
    strcpy(pal,buffer);
    printf("La palabra es:%s\n",pal);       
}

int main(void)
{

    int potw2;
    char w2[100] = "abc";
    potw2 = 3;
    potenciarw2(w2, potw2);

}
void-potentialw2(char*pal,int-potw2){
/*分配一些内存并复制到其中*/
字符缓冲区[100];
strcpy(缓冲区,pal);
对于(int i=0;i
使用strcat()的坏方法。
还有,如何声明
w2
呢?定义“它不起作用”。我猜你得到了你想要的:2次递增的幂,而不是n次。这段代码不应该编译,也许
char w2[100]=“abc”
?注意
strcat()
要求源字符串和目标字符串不同:正式的C99原型是
char*strcat(char*restrict s1,const char*restrict s2)
restrict
关键字表示“字符串不得重叠”-它们必须不同。C标准还特别指出(对于
strcat()
以及许多其他函数):如果在重叠的对象之间进行复制,则行为是未定义的。如果不超过系统上可用的ram,则可以是您想要的任何值。检查update.si en esta parte:fprintf(stdout,“ingree un texto(máx.99字符)>”;没有卡德纳、波尔·伊克姆博和卡德勒·卡德勒没有定义“转换”这个词吗?对不起,我必须用英语回答。如果你想用西班牙语聊天iharob@gmail.com. 我不明白你的意思。这个
&caracteres[c]
应该是什么类型的?也许
字符[N]
?如果是这样,
&caracteres[c]
很简单,相同的数组只是从
c
开始,而不是从开始。我有每个示例,&caracteres[0],&caracteres[1],&caracteres[2],我如何将名为caracteres的数组类型char的这些元素放在以下位置:(scanf(%99[^\n]”,word)?您想
scanf()
多个单词?那你应该问一个新问题。@iharob我看到的唯一一个可以称为javaish的东西是他的缩进风格(在同一行上打开大括号)这对java来说并不是唯一的。我已经看到了很多C++和C++的缩进/支撑样式。C已经允许了代码> //< /COD>风格注释。在任何一种语言中使用
/**/
作为单行注释都是愚蠢的。@CareyGregory是的,当然,这不是讨论的好理由。程序员可以使用他们想要的任何风格,如果他们尊重他们使用的编码风格,我的意思是如果它是一致的。这只是我的观点,可能是错误的。而且这也是品味的问题,一些人PL有很差的品味,有些则不。@ IHAROBC99增加了对C++风格评论的支持,所以我使用了这个特性。我也更喜欢在任何代码块周围使用括号,即使它是一行。@ IHAROB我恰好同意你的品味。我不喜欢这种缩进风格,但它只是风格。没有什么“错”。关于它。当你的评论是一行代码中的一行时,使用
/
更清晰、更简洁,并节省水平屏幕空间。如果<