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我恰好同意你的品味。我不喜欢这种缩进风格,但它只是风格。没有什么“错”。关于它。当你的评论是一行代码中的一行时,使用/
更清晰、更简洁,并节省水平屏幕空间。如果<