在此 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]
您将 i
和 length
声明为 char
,不能表示 127
以上的数字。它们将溢出大于该值的值。例如,将它们设为 short
或 int
。
有几个缺点。
第一个是变量 length
和 i
的声明不正确,它们被声明为 char
.
类型
char *s, length, i;
它们不能存储高于 127
或 255
的值,具体取决于类型 char
的行为是否与类型 signed char
或 unsigned 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 遇到其中任何一个的真实价值。
除某些测试用例外,我们必须为 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]
您将 i
和 length
声明为 char
,不能表示 127
以上的数字。它们将溢出大于该值的值。例如,将它们设为 short
或 int
。
有几个缺点。
第一个是变量 length
和 i
的声明不正确,它们被声明为 char
.
char *s, length, i;
它们不能存储高于 127
或 255
的值,具体取决于类型 char
的行为是否与类型 signed char
或 unsigned 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 遇到其中任何一个的真实价值。