这是我到目前为止所拥有的:
while ((currentChar != '\0') && (i < (length - 1)))
{
if (isalnum(*currentChar))
{
foundAlphaNum = 1;
}
if (*currentChar != ' ' && *currentChar != '\t' && *currentChar !='\n' && foundAlphaNum)
{
modifiedString[i] = *currentChar;
i++;
}
else if ((*currentChar == ' ' || *currentChar == '\t') && !foundAlphaNum)
{
modifiedString[i] = *currentChar;
i++;
}
else if(*currentChar == '\n')
{
modifiedString[i] = *currentChar;
i++;
foundAlphaNum = 0;
}
currentChar++;
}
// add null terminating char (maybe...)
modifiedString[i] = '\0';
printf("%s\n", modifiedString);
继承我的输出:
" HelloLbaldkgabcdefghijklmnopqrstuvwxyz0123456789
helluhworldzguhmornings
hhulsuhfhdjfue12345678910morealphabettseee"
它应该在第一个字母出现之前留下任何空白,它在第一行显示,但它在其他行上删除它们。
我已经尝试将其重置为0,但它为我提供了分段故障核心转储
答案 0 :(得分:1)
当您到达行尾
时,您不会重置foundAlphaNum
你应该再添加一个if语句
else if ( *currentChar == '\n' )
{
modifiedString[i] = *currentChar;
foundAlphaNum = false;
}
你可以做这样的事情
char buf[255] = {" your string bla bla\n bla bla bla\n bla bla"};
char* p = buf;
int targetIndex = 0;
char modifiedString[255] = {'\0'};
bool beforeLetter = true;
for (p = buf; *p && targetIndex < sizeof(buf); ++p)
{
if (*p == '\n')
{
beforeLetter = true;
}
else if ( isspace(*p) && beforeLetter )
{
modifiedString[targetIndex++] = *p; // copy preceding spaces
}
else if ( isspace(*p) && !beforeLetter )
{
; // skip spaces after letter is found
}
else if ( isalphanum(*p) )
{
beforeLetter = false;
modifiedString[targetIndex++] = *p;
}
}
modifiedString[targetIndex++] = '\0';
答案 1 :(得分:0)
检查以下代码:
while(//Assuming you are doing it line by line //)
{
i=0;
flag = 0;
while ((currentChar != '\0') && (i<length-1))
{
if (isalnum(*currentChar))
{
flag = 1;
modifiedString[i] = *currentChar;
i++;
}
else if((*currentChar == ' ' || *currentChar == '\t') && !flag)
{
modifiedString[i] = *currentChar;
i++;
}
currentChar ++;
}
modifiedString[i] = '\0';
//print or store the modified string for this line //
}
答案 2 :(得分:0)
要使代码忽略每行的前导空格,您可以在找到换行符时将foundAlphaNum
重置为零...但是您应该这样做'\n'
的测试实际发生的地方。在修订后的代码中,对'\n'
的检查发生在else
子句后面,if
(后面两个),如果已在行上找到字母数字字符,则执行foundAlphaNum
或者更早的,因为此错误会阻止while
被重置。
您的currentChar
循环条件中也存在错误,您将指针'\0'
(而非其指向的角色)与/* == fixed loop condition == */
while ((*currentChar != 0) && (i < (length -1)))
{
if (isalnum(*currentChar))
{
foundAlphaNum = 1;
}
/* == moved '\n' test (now checked first) == */
if (*currentChar == '\n')
{
modifiedString[i] = *currentChar;
i++;
foundAlphaNum = 0;
}
else if (*currentChar != ' ' && *currentChar != '\t' && foundAlphaNum)
{
modifiedString[i] = *currentChar;
i++;
}
else if ((*currentChar == ' ' || *currentChar == '\t') && !foundAlphaNum)
{
modifiedString[i] = *currentChar;
i++;
}
currentChar++;
}
// add null terminating char (maybe...)
modifiedString[i] = '\0';
printf("%s\n", modifiedString);
进行比较,这可能导致你的段错误。
修复这些问题(保留代码主要是这样)可能会给出:
while ((*currentChar != 0) && (i < length - 1))
{
if (isalnum(*currentChar))
foundAlphaNum = 1;
switch (*currentChar) {
case '\n':
foundAlphaNum = 0;
case ' ':
case '\t':
if (foundAlphaNum)
break;
default:
modifiedString[i++] = *currentChar;
}
currentChar++;
}
modifiedString[i] = '\0';
puts(modifiedString);
然而,仍然有足够的空间来清理东西。例如:
if
在上文中,如果找到字母数字字符,则foundAlphaNum
设置switch
。然后foundAlphaNum
使用案例直通,如果找到换行则清除foundAlphaNum
,然后将该字符添加到新字符串,除非它是空格或制表符并且currentChar
是组。然后isalnum()
递增,添加终止nul,并打印字符串。
另请注意,您的代码(以及上面的替代方法)仅剥离空格和水平制表符,并且仅在行上找到字母数字字符后才会这样做(与任何非空格字符相对) ,像标点符号)。如果这不是您想要的,您可能希望将*currentChar
替换为{{1}}不是空格或制表符。
答案 3 :(得分:-1)
i=0;
flag = 0;
while ((currentChar != '\0') && (i<length-1))
{
if (isalnum(*currentChar))
{
flag = 1;
modifiedString[i] = *currentChar;
i++;
}
else if((*currentChar == ' ' || *currentChar == '\t') && !flag)
{
modifiedString[i] = *currentChar;
i++;
}
else if(*currentChar == '\n')
{
flag = 0 ;
}
currentChar ++;
}
modifiedString[i] = '\0';
//print or store the modified string for this line //
我认为这样可行......试试这个..