在C语言中给字符串中的单词添加空格

3
我正在尝试编写一个程序,在单词之间插入空格以适应列宽,例如:
  • 您读入一行文本,例如:早上好你怎么样?
  • 您读入列宽,例如:40
  • 然后我已经数出了这个文本中有多少个空格(4个)。
  • 现在我需要在这些单词之间分配剩余的空格,使文本长度为40。
例如:
Good     morning     how     are    you?
1234567890123456789012345678901234567890

当我尝试在单词之间插入空格时,遇到了问题,因为我不知道如何做。这是我目前的代码。

#include <stdio.h>
#include <string.h>
char text[65], spaces[50], ch;
int i, remainder, spacesr, count, column, length, distribution;
int main(){
    i = 0;
    count = 0;
    printf("Please enter a line of text: ");
    while(ch != '\n')
    {
        ch = getchar();
        text[i]=ch;
        i++;
    }
    text[i]='\0'; 
    printf("Text: %s",text);
    printf ("Please enter the width of the column: ");
    scanf ("%d", &column);
    for (i = 0; text[i] != '\0'; i++) {
        if (text[i] == ' ') {
            count++;
        }
    }
    length = strlen(text);
    spacesr = column - length;
    distribution = spacesr / count;
    remainder = spacesr % count;
    if (length > column) {
        printf ("ERROR: Length of text exceeds column width.");
    }
}

我已计算文本中的空格数量,然后计算出剩余的空格数量,并将其除以空格数量,以确定每个单词之间需要放多少个空格。这些剩余的空格将在主要的空格输入后均匀分布。
“主要的空格”是什么意思?
基本上,我想通过在单词之间添加空格来适应一个40个字符宽度的列,例如:“早上好,你好吗?”。 是否有可能做到这样?
for (i = 0; text[i] != '\0'; i++) {
    if (text[i] == ' ') {
    then add a certain amount of spaces to it

什么是主空间? - shafeeq
1
请注意,程序中的所有变量都应该是main()函数内部的局部变量;它们中没有一个需要成为全局变量。尽可能避免使用全局变量。有时候它们是必要的,并且是处理某些情况的最佳方式。然而,在编码的普通过程中,变量应该是在使用它们的函数内部的局部变量。 - Jonathan Leffler
看起来你不能使用 string.h 头文件,是这样吗? - Iharob Al Asimi
1
@iharob:代码包含<string.h>并使用strlen()——这表明这些函数可以被使用。 - Jonathan Leffler
我怎么使用strtok将字符串拆分为单独的单词,然后在每个单词后添加指定数量的空格? - J. Doe
显示剩余4条评论
2个回答

0
你需要将输入的字符串拆分成单独的单词。参考StackOverflow上此前的问题中的回答,了解一些可用的技术。
之后,只需在单词之间正确地添加空格,即可发出这些单独的单词。

2
这听起来更像是一条评论。附注:我没有投反对票。 - R Sahu
这不是一条评论。这个问题看起来像是一个作业问题。根据FAQ的规定:“寻求作业帮助的问题必须包括您已经完成的工作摘要,以及您在解决问题时遇到的困难描述。”这里没有描述困难,所以我从代码示例中推断出来了。我不会为作业问题编写代码。我建议思考问题的方法,帮助提问者理解如何像有经验的开发人员一样分解问题,并在适当时指向现有答案中的代码。 - Richard Schwartz
如果一个问题不清楚,投票关闭它,给它点踩。不要用质量低劣的答案回答它。 - R Sahu
我对这两点都有不同意见。 - Richard Schwartz
1
话虽如此,我更希望在StackOverflow上不要欢迎作业问题,但它们确实存在。 - Richard Schwartz

0

做这件事的许多方法之一。

假设totalSpace是我们必须放入字符串的缓冲区长度,str = 我们有的原始字符串。

算法:

int extraSpace = totalSpace - strlen(str);
int numWords = findWordsInString(str);
int numSpaces = numWords - 1;
int incrementEachSpaceby = extraSpace/numSpace;

//Now linear scan of str and increase spaces by value of incrementEachSpaceby 

    char *newStr = malloc(totalspace);
    int i =0, int j = 0;
    int k;
    while (i < strlen(str) && j < totalspace)
    {
        while (str[i] != ' ') {
            newStr[j++] = str[i++];
        }

        while (str[i] == ' ')
            newStr[j++] = str[i++];

        k = incrementEachSpaceby;

        while (k) { 
            newStr[j++] = ' ';
            k--;
        }
    }

这只是一个表面的想法,你可以进一步改进它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接