我有一个简单的问题需要解决:
读取一个字符串,打印没有空格的字符串和数字 空格。
我可以使用2个字符串执行此操作,一个用于存储用户字符串,另一个用于存储相同的字符串而不包含空格。 但我想只用一个字符串来做这个。
到目前为止我有什么:
while(str[i] != '\0'){
if(str[i] == ' '){
contEsp += 1;
}else{
strcpy(&str[i - contEsp], &str[i]);
}
i++;
}
问题:
它没有计算空格数。
如果用户键入双倍或更多空格,则程序不计算,也不会删除空格。
问题:
我的代码有问题吗?
是否可以只使用一个字符串来执行此操作?
答案 0 :(得分:4)
试试这段代码:
int i = 0, contEsp =0;
while(str[i] != '\0')
{
str[i-contEsp] = str[i];
if(str[i] == ' ')
contEsp++;
i++;
}
str[i-contEsp] = '\0';
printf("String: %s, Spaces = %d\n",str, contEsp);
答案 1 :(得分:0)
1)最后的空格也不会被削减。循环后添加检查和操作。
2)我建议划分局部空间计数器和全球空间计数器的概念。
unsigned int contEsp = 0;
unsigned int i = 0;
unsigned int localEsp = 0;
while(str[i] != '\0'){
if(str[i] == ' '){
contEsp += 1;
localEsp += 1;
}else if(contEsp) {
strcpy(&str[i - localEsp], &str[i]);
localEsp = 0;
continue;
}
i++;
}
if ( localEsp > 0 )
strcpy(&str[i - contEsp], &str[i]);
答案 2 :(得分:0)
由于问题标记为“性能”:您的方法是在遇到空格时复制整个剩余字符串。虽然实际上可能无关紧要,但效率低下。只需逐个处理字符,例如:
unsigned remove_count_spaces(char *a) {
char *b = a;
unsigned ct = 0;
do {
if (*a == ' ') ct++;
else *b++ = *a;
} while(*a++);
return ct;
}
...另外检查ct
中可能的环绕。
答案 3 :(得分:0)
char* RemoveAndCountSpaces(char* s)
{
int contEsp = 0;
char* x = s;
char* org = s;
while(*s != '\0'){
if(*s == ' '){
contEsp++;
} else {
*x = *s;
x++;
}
s++;
}
*x = *s;
printf("%s\nSpaces Found: %d\n", org, contEsp);
return org;
}
答案 4 :(得分:0)
我的代码有什么问题?
1.计数未初始化为0
2. strcpy(&str[i - contEsp], &str[i]);
正在移动尚未处理的字符串,然后您的i
未对您认为的字符编制索引。
使用一个字符串可以做到这一点吗? 是的 - 下面
int CountAndBlank(char *str) {
size_t x = 0; /* index through un-spaced string */
size_t i; /* Index through original string */
for (i = 0; str[i]; i++) {
if (!str[i] == ' ') {
str[x++] = str[i];
}
}
str[x] = '\0';
return i - x; /* Spaces removed is the difference */
}
...
int Count = CountAndBlank(buf);
printf("Number of spaces removed from '%s' is %d\n", buf, Count);