在C中替换字符串数组中的字符串[关闭]

cl25kdpy  于 2023-10-16  发布在  其他
关注(0)|答案(4)|浏览(92)

已关闭,此问题需要details or clarity。它目前不接受回答。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

8天前关闭
Improve this question
我在替换C中字符串数组中的字符串时遇到了问题
基本上,我有:
char * words[3];
现在我们假设这里的字符串是“猫”,“狗”,“鸟”。
现在,我有一个包含“mouse”的char字[],我想在数组中用“mouse”替换“dog”。
我试过使用strcpy(words[2], word);,但这并不像预期的那样工作,我假设这是因为鼠标的长度大于狗的长度。所以,我想知道在这种情况下你会如何完成这项任务。
提前感谢任何帮助

fgw7neuy

fgw7neuy1#

#include <stdio.h>

int main(void) {
    char* words[3] = {"cat", "dog", "bird"};
    
    printf("The Initial List\n");
    for(int i=0; i<3; ++i)
    {
        printf("%d : %s\n", i, words[i]);
    }
    
    // Replace the middle entry
    char* replacement = "mouse";
    words[1] = replacement;
    
    printf("The Final List\n");
    for(int i=0; i<3; ++i)
    {
        printf("%d : %s\n", i, words[i]);
    }

    return 0;
}

输出:

Success #stdin #stdout 0.01s 5464KB
The Initial List
0 : cat
1 : dog
2 : bird
The Final List
0 : cat
1 : mouse
2 : bird
xxhby3vn

xxhby3vn2#

代码:

char * words[3];
words[0] = "cat";
words[1] = "dog";
words[2] = "bird";

.大致相当于:

// Internal memory you can't see:
char _string1[] = {'c','a','t','\0'} // Address 0x001234
char _string2[] = {'d','o','g','\0'} // Address 0x001238
char _string3[] = {'b','i','r','d','\0'} // Address 0x001242

// Your program memory:
char * words[3];
words[0] = (char *)0x001234;
words[1] = (char *)0x001238;
words[2] = (char *)0x001242;

重要的是char * schar s[]不一样,所以试图在0x001238上复制“mouse”并不能达到你想要的效果。
给定char word[] = "mouse";word确实有一个地址,所以你可以像在word[1] = word;中那样分配它,这将起作用。当然,如果你把word[0] = 'h';改成“house”,那么word[1]也会变成“house”。
如果这对你来说不是问题,那就好,否则你需要words是一个字符数组而不是一个指针数组,并确保有足够的字符来容纳所有你想要的单词。由于大多数单词都比这个短,所以很多字符都没有被使用,但这通常不是一个大问题。
否则,您将不得不使用malloc()free()strdup()等来管理内存,这会变得复杂,所以最好避免这种情况,除非您真的需要。

s4chpxco

s4chpxco3#

你说得对:不可能增加字符串的大小,因为数组中的每个指针都指向一个常量字符串。下面是如何可视化内存布局:

你可以用一种方式声明你的数组,为每个字符串提供足够的空间,即。

char words[3][256] = {"cat", "dog", "bird"};

事实上,由于这些是常量,数组应该声明为const,并且应该避免在实际程序中修改这些字符串。

brccelvz

brccelvz4#

下面的代码显示了一种实现方法。请注意,我们为将来的“mouse”strcpy()提供了足够的空间(10个字符)。这一点很重要,因为最初的声明:

char * words[3];

...只为3个char类型的指针留出空间。你不能安全地strcpy()到那些指针,即使它们在声明中用字符串初始化。

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

/* A multi-dimensional array with enough space for 3 strings 
of 9 characters each -- plus the terminating NUL ('\0') for 
each string. (3x10) We can safely strcpy() "mouse" to an 
array like this.*/
char  words[3][10] = {"cat", "dog", "bird"};
char  word[] = "mouse";

int main()
{
int iii;

    for(iii = 0; iii < 3; iii++)
        printf("%s\n", words[iii]);

    strcpy(words[2], word);
    printf("\n");

    for(iii = 0; iii < 3; iii++)
        printf("%s\n", words[iii]);
    
    return 0;
}

输出量:

cat
dog
bird

cat
dog
mouse

相关问题