我想连续添加字符串元素,例如st[]="morty"
,我想重复其元素,例如七次。它应该是st[]="mortymo"
。我写了一个函数,如下所示。 (长度函数为strlen
)。
void repeat(char* st,int n){
int i,k=0,l=length(st);
char* ptr;
ptr=(char*)malloc((n+1)*sizeof(char));
for (i=0;i<n;i++){
*(ptr+i)=*(st+k);
k++;
if(k==l)k=0;
}
}
答案 0 :(得分:1)
以下程序会重复原始字符串中的字符。 代码中的评论:
#include<stdio.h>
#include<stdlib.h>
char* repeat(const char* st, size_t n){
// use `const` to note that pointer `st` will not be modified
// for purity you may want to use type `size_t` since returning type of strlen is `size_t`
size_t i, k=0;
size_t l = strlen(st);
// do not use (char *) cast
char* ptr = malloc((n+1)*sizeof(char)); // allocate enough room for characters + NULL
for (i=0; i< n; i++)
{
ptr[i] = st[k]; // use index for readability
k++;
if (k == l)
k=0;
}
ptr[i] = 0; // terminate the string
return ptr;
}
int main( )
{
char *str = "12345";
str = repeat(str, 15);
printf("%s\n",str);
free (str); // free the allocated memory inside the repeat function
return 0;
}
输出:
123451234512345
答案 1 :(得分:0)
在repeat
函数中,您分配了ptr
来保存重复的字符串,但您没有返回或将其分配给st
。您可以按如下方式修改repeat
功能:
char* repeat(char* st,int n){
int i,k=0,l=strlen(st);
char* ptr;
ptr=(char*)malloc((n+1)*sizeof(char));
for (i=0;i<n;i++){
*(ptr+i)=*(st+k);
k++;
if(k==l)k=0;
}
*(ptr+n) = '\0';
return ptr;
}
/* some code*/
char *st = "morty";
st = repeat(st, 7);
这样您将重复字符串的结果存储在st
之后。
答案 2 :(得分:0)
如果我正确理解了作业,那么你需要一个像演示程序中所示的功能。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * repeat( const char *s, size_t n )
{
char *p = NULL;
size_t len = strlen( s );
if ( len == 0 ) n = 0;
p = ( char * )malloc( n + 1 );
if ( p )
{
size_t i = 0;
for ( size_t j = 0; i < n; i++ )
{
p[i] = s[j];
if ( ++j == len ) j = 0;
}
p[i] = '\0';
}
return p;
}
int main(void)
{
char *s = "Hi, Zusaetlich.";
char *p = repeat( s, 2 * strlen( s ) );
puts( p );
free( p );
return 0;
}
程序输出
Hi, Zusaetlich.Hi, Zusaetlich.
请注意,该函数的设计方式是,如果原始字符串为空,则结果字符串也为空,因为没有任何内容可以重复。
至于你的函数,它至少有一个内存泄漏,因为函数中分配的内存没有被释放。
同样,由于原始字符串未更改,因此应使用const
说明符限定相应的参数。第二个参数的类型应为size_t
,因为至少函数strlen
的返回类型为size_t
。
因此,应该在演示程序中显示该函数。
答案 3 :(得分:0)
由于您不打算修改void otherfunc() {
Map<Key, Value> map = new MyMap<>();
myfunc(map);
}
void myfunc(Map<Key, Value> map) {
Key k = someKey;
Value v = someValue;
map.put(k, v);
}
的内容,请继续并将其声明为st
。由于您打算在函数中分配新字符串,因此应将其返回给调用者。
const
您的问题不需要 char *repeat(const char* st,int n){
。调用标准函数。
k
不要投射 int i,l=strlen(st);
char* ptr;
的结果,因为这可以掩盖C中的致命错误。malloc
总是1.检查sizeof(char)
成功呼叫的结果
malloc
使用 ptr=malloc(n+1);
if (ptr == NULL) return NULL;
for (i=0;i<n;i++){
以惯用方式访问数组。请注意,只要[]
,k
会递增i
,但您正在应用k
的模运算。但是,C有一个模运算符,您可以直接在i
上使用。
ptr[i]=st[i%l];
}
确保新字符串NUL
已终止。声明您的函数返回结果,但您的实现无法执行此操作。
ptr[n] = '\0';
return ptr;
}
C有许多函数可以调用来为你复制,而不是你编写的逐字节循环。您的实现很简单,但下面是一个替代方案,还包括解决方案中缺少的其他错误检查。
(有些人可能会对使用sprintf
感到不满,但正确使用它。)
char *
repeat (const char *st, int n) {
int l = st ? strlen(st) : 0;
char *ret = (st && n > 0 ? malloc(n+1) : 0), *p = ret;
while (ret && n > 0) {
p += sprintf(p, "%.*s", (l < n ? l : n), st);
n -= l;
}
return ret ? ret : "(nil)";
}