我正在尝试将' '
(空格)替换为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
(不包括空格)并将其追加到字符串{{1 }})。所以输出应该是这样的:
o
如果我的代码中有其他错误,请告诉我。
UPD:这不应该替换循环中的所有空格。如果源字符串包含8个空格,则应打印8行,并且每行中只应替换一个空格。
答案 0 :(得分:6)
你太过于复杂,我只是TL; DR。
有些评论说 肯定 想要阅读,学习,拥抱并使用:
予。 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("%s\n", buf);
return 0;
}
答案 1 :(得分:2)
你可以尝试这个。问题来自于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++] = '_';
}
}
答案 2 :(得分:1)
不使用库函数!!!
while(*string)
{
if(*string=='\\')
{
*string++;
while(repl_len--)
*dest++ = *repl_string++;
}
else
{
*dest++ = *string++;
}
repl_string = temp_repl_string;
repl_len = temp_repl_len;
}
答案 3 :(得分:0)
#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 = '\0';
printf("out: \"%s\"\n", o);
free(o);
return 0;
}
答案 4 :(得分:0)
我看到已经添加了很多答案,但这可能只需要一个循环即可完成。由于字符串很短,你可以牺牲CPU上的内存并分配一个比原始字符串大3倍的数组,并确保它不会溢出:
const char* string= "12 34 56";
size_t length= strlen(string);
char result[length*3 +1];
unsigned int index= 0;
memset(result, '\0', length*3+1);
for(int i=0; i<length; i++)
{
if(string[i]!= ' ')
{
result[index++]= string[i];
}
else
{
strcat(result,"___");
index+= 3;
}
}
答案 5 :(得分:0)
我找到了另一个thread,在看完答案后,我发现右边的行应该是这样的:
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;
}
然后打印出所需的输出。