#include<stdio.h>
int main()
{
unsigned int n=0;
char str[100];
char *ptr,*ptr1;
printf("Enter the string = ");
gets(str);
ptr = &str[0];
while(*ptr!='\0')
{
n++;ptr++;
}
ptr=&str[0];
while(*ptr!='\0')
{
if(*ptr==' ')
{
n--;
for(ptr1=++ptr;*ptr1!='\0';ptr1++)
{
*ptr=*ptr1;
ptr++;
}
ptr=&str[0];
}
ptr++;
}
printf("Modified string = ");
for(int i=0;i<n;i++)
{
printf("%c",str[i]);
}
return 0;
}
我知道从字符串中删除空格的另一种方法,但是我想用指针来做这件事,但我不知道这段代码有什么问题?
我真的很感激一些帮助。
答案 0 :(得分:4)
SecureRandom r = new SecureRandom();
byte[] ivBytes = new byte[16];
r.nextBytes(ivBytes);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(ivBytes));
使用测试字符串char *rd; // "read" pointer
char *wr; // "write" pointer
rd = wr = string; // initially, both read and write pointers point to
// beginning of the string
while ( *rd != 0 ) // while not at end of string
{
while ( isspace( *rd ) ) // while rd points to a whitespace character
rd++; // advance rd
*wr++ = *rd++; // copy *rd to *wr, advance both pointers
}
*wr = 0; // terminate the result
printf( "squished: %s\n", string );
完成此操作后,我们从以下开始("This is a test"
表示字符串终结符):
\0
前四个字符不是空白,所以我们只是用相同的值覆盖这些字符并推进两个指针,给我们
+----------------------- rd
|
V
This is a test\0
^
|
+----------------------- wr
由于 +------------------- rd
|
V
This is a test\0
^
|
+------------------- wr
指向空格,我们继续前进,直到找到非空格字符:
rd
然后我们将非空格字符写入 +--------------- rd
|
V
This is a test\0
^
|
+------------------- wr
指向的位置:
wr
保持这种状态,直到我们找到下一个空格字符:
+--------------- rd
|
V
Thisi is a test\0
^
|
+------------------- wr
继续将 +------------- rd
|
V
Thisis is a test\0
^
|
+----------------- wr
推进到下一个非空白字符:
rd
将其写入 +------------ rd
|
V
Thisis is a test\0
^
|
+----------------- wr
:
wr
泡沫,冲洗,重复:
+------------ rd
|
V
Thisisa is a test\0
^
|
+----------------- wr
+---- rd
|
V
Thisisatesta test\0
^
|
+------------ wr
现在指向字符串的结尾。我们退出主循环并将rd
写入0
以终止字符串:
wr
我更喜欢这种解决方案,因为每个角色只会移动一次到最终位置。你最终会在字符串的开头覆盖你不需要的字符,但我认为这是一个合理的权衡。
修改强>
Chux的版本有点流畅,绝对更符合C的精神:
+---- rd
|
V
Thisisatest\0 test\0
^
|
+------------ wr
同样,每个角色只会移动一次到最终位置。
答案 1 :(得分:1)
有两个问题
在这一行
for(ptr1 = ++ptr ; *ptr1 != '\0' ; ptr1++)
因为你增加了ptr
,因此ptr1
和ptr
指向同一个地方,所以你实际上是将字符复制到同一个地方,而不是{{1}应该指向ptr1
而ptr + 1
不应该被修改。
您也可以在&#34; 移动&#34;之后开始字符串的开始。从正确的一个地方到左边的所有字符,这里
ptr
在移动字符的循环之后,您应该保存先前的位置并指向它,这样会更有效。
我修复了您的代码,以下代码正常运行
ptr = &str[0];