在此 char 指针的某些情况下发现错误?

finding error in some cases of this char pointer?

除某些测试用例外,我们必须为 strings.It 之间的每个 space/gap 输出新行。(字符串长度范围在 0 到 1000 之间。)

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

int main() {

  char *s, length, i;
  s = malloc(1024 * sizeof(char));
  scanf("%[^\n]", s);
  s = realloc(s, strlen(s) + 1);
  // Write your logic to print the tokens of the sentence here.
  length = strlen(s);

  for (i = length - 1; i >= 0; i--) {
    if (*(s + i) == ' ')
      *(s + i) = '\n';
  }

  for (i = 0; i <= length - 1; i++) {
    printf("%c", *(s + i));
  }
  return 0;
}

这是测试用例


isaegb spqe soslux feb zpkqvly jfavnxk bkyb akxc zxknsau wws hojqcxw vh vioxmqp c y vlgvzdv kg uqoddl cvjvo xkglami bnny whqnfyl gtr qfqr gezclci lwboj pgz refjok lsj qnswwvk v yv knacos ttjf ngb bobcezv tus ijgv ak dtylnij sbba wo lwojx pmxrwt fspq hao dp tnlw nmbqe ynf h rkbucw bddth v qxce ithzul if xw tzbsqq qx m ujf czkylju rhhdfj lbuph tasmexr g jzkvshc ppv scwr w qhyyeil t krvert fdz kdjtnm ioplmqy hupb bte auza lsmd aeou vrlp imxy bixzt xob arjgp arxsl pulrt mf k vtwbi xx vm wqlz pm vragv aptjle siqvy rifmztd wxytzs ukqqrxm rfr w aipunhj omwr mg j xei we encp ky e efgsun cak vdstjb gkxporp ziwmbj sut nltxhk hqil ygxmw eodsp ewr femlf u kw hmber uvfttlv vwmtmgv gohkvu syrp yayndiw qnshe gdofdyi ziszbk gb qh mrepw t hrisl lwgej wjwl b jvycei etubxfa ft fbdyjki pdjntfi odkyqi s uu ozqgiz e ryjw ekkbwvt i yqqoql w ch poco dqlfyri vltaoyt fsetj ksw jtvddy qmhs ciw qkae h ihyji iwbato xpauhh kcdbh dt zyycqgv jjo f qi zfmxq lhsd=sleg=zmwo1y]

您将 ilength 声明为 char,不能表示 127 以上的数字。它们将溢出大于该值的值。例如,将它们设为 shortint

有几个缺点。

第一个是变量 lengthi 的声明不正确,它们被声明为 char.

类型
char *s, length, i;

它们不能存储高于 127255 的值,具体取决于类型 char 的行为是否与类型 signed charunsigned char.

它们应该声明为 size_t 类型 - 函数的返回类型 strlen

其实这个函数的调用是多余的。您可以依赖输入字符串的终止零。

无需动态分配和重新分配数组。您可以声明一个具有自动存储持续时间的数组。

字符串的子串之间可以有连续的空格。您不处理此类情况。

注意,输出一个字符串的子串是指改变字符串本身。

这是一个演示程序,展示了如何执行任务。

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

int main(void) 
{
    enum { N = 1001 };

    char s[N] = "";

    fgets( s, sizeof( s ), stdin );

    const char *delim  = " \t\n";

    for ( const char *p = s; *p; )
    {
        p += strspn( p, delim );

        int n = strcspn( p, delim );

        if ( n ) printf( "%*.*s\n", n, n, p );

        p += n;
    }

    return 0;
}

如果输入例如以下字符串 " Hello Gautam Goyal" 那么程序输出将是

Hello
Gautam
Goyal

求助:可以使用ctype.h下的函数isspace()。它读取 space 个字符,例如 '\n'、'\t'、' ' 等;和 returns 遇到其中任何一个的真实价值。