gpt4 book ai didi

c - 在C中的字符串中为每个单词的结尾添加空格

转载 作者:行者123 更新时间:2023-12-02 07:33:04 25 4
gpt4 key购买 nike

这里我有一个字符串:

*line = "123 567 890  ";

末尾有两个空格。我希望将这 2 个空格添加到 3 的末尾和 7 的末尾,使其像这样:

"123  567  890"

我试图实现以下步骤:

  1. 通过单词列表(字符串数组)将字符串解析为单词。从上游函数中,我将获得变量 word_count、*line 和 remain 的值。
  2. 在最后用一个空格将它们连接起来。
  3. 按从左到右的优先顺序分配空间。
  4. 将所有内容连接在一起,使其成为一个新的*行。

Word_count 是*行中的单词数,remain 是剩余的空格数。

这是我的错误代码的一部分:

int add_space(char *line, int remain, int word_count)
{
if (remain == 0.0)
return 0; // Don't need to operate.

int ret;
char arr[word_count][line_width];
memset(arr, 0, word_count * line_width * sizeof(char));

char *blank = calloc(line_width, sizeof(char));
if (blank == NULL)
{
fprintf(stderr, "calloc for arr error!\n");
return -1;
}

for (int i = 0; i < word_count; i++)
{
ret = sscanf(line, "%s", arr[i]); // gdb shows somehow it won't read in.
if (ret != 1)
{
fprintf(stderr, "Error occured!\n");
return -1;
}
arr[i] = strcat(arr[i], " "); // won't compile.
}

size_t spaces = remain / (word_count * 1.0);
memset(blank, ' ', spaces + 1);
for (int i = 0; i < word_count - 1; i++)
{
arr[0] = strcat(arr[i], blank); // won't compile.
}

memset(blank, ' ', spaces);
arr[word_count-1] = strcat(arr[word_count-1], blank);

for (int i = 1; i < word_count; i++)
{
arr[0] = strcat(arr[0], arr[i]);
}

free(blank);
return 0;
}

它不工作了,你能帮我找到不工作的部分并修复它们吗?谢谢你们。

最佳答案

这是一个替代建议 - 可能更快,并且使用更少的内存。

首先 - 注意您返回的行将与您开始的行大小相同 - 所以我们只需要移动单词并添加空格。据我所知,您当前的代码似乎没有尝试实际返回固定字符串……

从字符串末尾开始计算“额外空格”的数量(我认为这是您的remain 值)。现在向后遍历字符串,直到找到最后一个单词的开头,然后移动它。

我写了一个示例 - 使用一些调试语句使发生的事情更加明显,并在添加空格时包含“”而不是“”。这会更清楚地向您展示它在做什么(尽管您在使用此代码时显然希望将“”替换为“”)。

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

int distributeSpaces(char* s, int wordCount, int spaceCount);

int main(void) {
char *myString = "There is a house in New Orleans ";
char *sCopy;
sCopy = malloc(strlen(myString)+1);
strcpy(sCopy, myString);
printf("Initial string: '%s'\n", myString);
distributeSpaces(sCopy, 7, 7);
printf("\nString is now '%s'\n", sCopy);
return 0;
}

int distributeSpaces(char* s, int wordCount, int spaceCount) {
int ii, length;
int wordLength, wordEnd;
int spaceLeft = spaceCount + 1;
length = strlen(s);
printf("string is %d characters long\n", length);
wordEnd = length - spaceLeft - 1;
wordLength = 0;
for(ii = length - spaceLeft - 1; ii > 0; ii--) {
wordLength++;
if(s[ii] == ' ') {
// printf("found space - moving %d characters from %d to %d\n", wordLength, ii, ii+spaceLeft);
printf("before memmove, string is '%s'\n", s);
memmove(&s[ii+spaceLeft], &s[ii+1], wordLength);
printf("after memmove, string is now '%s'\n", s);
memset(&s[ii], '*', spaceLeft);
printf("after memset, string is now '%s'\n", s);
spaceLeft -= spaceLeft / wordCount--;
// printf("space left is now %d\n", spaceLeft);
wordLength = 0;
ii--;
}
}
return 0;
}

输出:

Initial string: 'There is a house in New Orleans       '
string is 38 characters long
before memmove, string is 'There is a house in New Orleans '
after memmove, string is now 'There is a house in New OrleansOrleans'
after memset, string is now 'There is a house in New********Orleans'
before memmove, string is 'There is a house in New********Orleans'
after memmove, string is now 'There is a house in New***New**Orleans'
after memset, string is now 'There is a house in*******New**Orleans'
before memmove, string is 'There is a house in*******New**Orleans'
after memmove, string is now 'There is a house in***in**New**Orleans'
after memset, string is now 'There is a house******in**New**Orleans'
before memmove, string is 'There is a house******in**New**Orleans'
after memmove, string is now 'There is a houshouse**in**New**Orleans'
after memset, string is now 'There is a*****house**in**New**Orleans'
before memmove, string is 'There is a*****house**in**New**Orleans'
after memmove, string is now 'There is a**a**house**in**New**Orleans'
after memset, string is now 'There is****a**house**in**New**Orleans'
before memmove, string is 'There is****a**house**in**New**Orleans'
after memmove, string is now 'There isis**a**house**in**New**Orleans'
after memset, string is now 'There***is**a**house**in**New**Orleans'

String is now 'There***is**a**house**in**New**Orleans'

我认为这就是您所追求的。

关于c - 在C中的字符串中为每个单词的结尾添加空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19749304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com