我正在尝试用C.中的'___'
(三重下划线)替换' '
(空格)
这是我的代码:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *a = "12 34 56";
int a_l = strlen(a);
printf("str1: "%s" (%d)n", a, a_l);
char *b = "___";
int b_l = strlen(b);
printf("str2: "%s" (%d)n", b, b_l);
for (int i = 0; i < a_l; i++) {
if (a[i] == ' ') {
char *o = malloc(a_l + b_l);
strncpy(o, a, i);
strncpy(o + i, b, a_l);
//strncpy help
printf("out: "%s"n", o);
}
}
return 0;
}
到目前为止,我认为这是正确的,但我需要用正确的strncpy
替换注释行(取字符串a
的其余部分(不包括空格)并将其附加到字符串o
)。所以输出应该是这样的:
str1: "12 34 56" (8)
str2: "___" (3)
out: "12___34 56"
out: "12 34___56"
如果我的代码中还有其他错误,请告诉我。
UPD:这不应该替换循环中的所有空格。如果源字符串包含8个空格,则应打印8行,并且每行仅替换一个空格。
你把这件事搞得太复杂了,以至于我只是TL;博士
您可能肯定想要阅读、学习、接受并使用的一些备注:
I。int
不适用于字符串长度和其他内容。size_t
用于字符串长度和内容。
II。字符串文字不能修改,所以使用传统的char *
类型将它们分配给变量无论如何都是不好的,const
-限定了糟糕的指针基类型。
III。如果不需要动态内存管理(我们不再生活在1989年),请使用VLA而不是malloc()
。
IV。NUL
-终止您的字符串,因为C stdlib例程希望您这样做。
int main()
{
const char *in = "foo bar baz";
int nspc = 0;
for (const char *p = strchr(in, ' '); p; p = strchr(p + 1, ' '))
nspc++;
char buf[strlen(in) + nspc * 2 + 1];
memset(buf, 0, sizeof(buf));
const char *s = in;
for (const char *p = strchr(s, ' '); p; p = strchr(s, ' ')) {
strncat(buf, s, p - s);
strcat(buf, "___");
s = p + 1;
}
const char *end = in + strlen(in);
strncat(buf, s, end - s);
printf("%sn", buf);
return 0;
}
你可以试试这个。问题在于malloc中的a_l+b_l总是相同的值。它不受空间数量的影响。
int count = 0, index = 0;
for (int i = 0; i < a_l; ++i) {
if (a[i] == ' ') {
count++;
}
}
const char *o = malloc(a_l + 2 * count + 1); // 2 is because you add 3 new symbols, but remove 1 so 3 - 1 = 2
memset(o, 0, sizeof(o));
for (int i = 0; i < a_l; ++i) {
if (a[i] != ' ')
o[index++] = a[i];
else {
o[index++] = '_';
o[index++] = '_';
o[index++] = '_';
}
}
不使用库函数!!!
while(*string)
{
if(*string=='\')
{
*string++;
while(repl_len--)
*dest++ = *repl_string++;
}
else
{
*dest++ = *string++;
}
repl_string = temp_repl_string;
repl_len = temp_repl_len;
}
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
size_t my_strlen(const char *str, size_t *spc){
size_t len;
*spc = len = 0;
while(*str){
++len;
if(*str++ == ' ')++*spc;
}
return len;
}
int main(void){
char *a = "12 34 56";
size_t spc;
int a_l = my_strlen(a, &spc);
printf("str1: "%s" (%d)n", a, a_l);
char *b = "___";
int b_l = strlen(b);
printf("str2: "%s" (%d)n", b, b_l);
char *p, *o = malloc(a_l - spc + spc * b_l + 1);
p=o;
for (int i = 0; i < a_l; i++) {
if(a[i] == ' ') {
strncpy(p, b, b_l);
p += b_l;
} else {
*p++ = a[i];
}
}
*p = ' ';
printf("out: "%s"n", o);
free(o);
return 0;
}
我看到添加了许多答案,但这可能只需一个循环就可以完成。由于字符串很短,您可以牺牲CPU上的内存,分配一个比原始字符串大3倍+1的数组,并确保它不会溢出:
const char* string= "12 34 56";
size_t length= strlen(string);
char result[length*3 +1];
unsigned int index= 0;
memset(result, ' ', length*3+1);
for(int i=0; i<length; i++)
{
if(string[i]!= ' ')
{
result[index++]= string[i];
}
else
{
strcat(result,"___");
index+= 3;
}
}
我找到了另一个线程,在阅读了答案后,我发现右边的行应该是这样的:
strncpy(o + i + b_l, a + i + 1, a_l - i);
在这个线程中建议了一些修复之后,我的代码看起来是这样的:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
char *a = "12 34 56";
size_t a_l = strlen(a);
printf("str1: "%s" (%d)n", a, a_l);
char *b = "___";
size_t b_l = strlen(b);
printf("str2: "%s" (%d)n", b, b_l);
for (int i = 0; i < a_l; i++) {
if (a[i] == ' ') {
char *o = malloc(a_l + b_l);
strncpy(o, a, i);
strcpy(o + i, b);
strncpy(o + i + b_l, a + i + 1, a_l - i);
printf("out: "%s"n", o);
free(o);
}
}
return 0;
}
这会打印出想要的输出。