我想用单个空格替换字符串中的多个空格,但是我的以下代码不起作用。什么是逻辑错误?
#include<stdio.h>
#include<string.h>
main()
{
char input[100];
int i,j,n,z=0;
scanf("%d",&n);
z=n;
for(i=0;i<n;i++)
scanf("%c",&input[i]);
for(i=0;i<n;i++)
{
if(input[i]==' ' && (input[i+1]==' ' || input[i-1]==' '))
{
--z;
for(j=i;j<n;j++)
input[j]=input[j+1];
}
}
for(i=0;i<z;i++)
printf("%c",input[i]);
printf("\n");
}
答案 0 :(得分:5)
我会做这样的事情:
void replace_multi_space_with_single_space(char *str)
{
char *dest = str; /* Destination to copy to */
/* While we're not at the end of the string, loop... */
while (*str != '\0')
{
/* Loop while the current character is a space, AND the next
* character is a space
*/
while (*str == ' ' && *(str + 1) == ' ')
str++; /* Just skip to next character */
/* Copy from the "source" string to the "destination" string,
* while advancing to the next character in both
*/
*dest++ = *str++;
}
/* Make sure the string is properly terminated */
*dest = '\0';
}
当然,上面的函数要求你正确地终止你当前没有的字符串。
上面的功能基本上是将字符串复制到自身上。例外情况是当有空格时,简单地丢弃多个空格。
由于函数修改了源字符串,因此不能在字符串文字中使用它。
答案 1 :(得分:2)
scanf
给您一些问题:在输入长度\n
后,它会显示您提供的n
。因此,您将错过自for
循环退出以来的最后一个字符。已经给出的答案已经足够好了。但是如果你想遵循自己的逻辑,试试这个:
void main()
{
char input[100];
int i = 0,j,n = 0;
while ((input[n] = getchar()) != '\n') {
n++;
}
input[n] = '\0';
while (i < n)
{
if(input[i]==' ' && (input[i+1]==' ' || input[i-1]==' '))
{
for(j=i;j<n;j++)
input[j]=input[j+1];
n--;
}
else
{
i++;
}
}
printf("%s\n",input);
printf("\n");
}
答案 2 :(得分:1)
if(input[i]==' ' && (input[i+1]==' ' || input[i-1]==' '))
案例“1 3”:当i == 0接受输入[i-1]超出界限
scanf("%d",&n);
保持换行符,(输入[0]&lt; - '\ n')
修复
scanf("%d%*c",&n);
#include <stdio.h>
char* uniq_spc(char* str){
char *from, *to;
int spc=0;
to=from=str;
while(1){
if(spc && *from == ' ' && to[-1] == ' ')
++from;
else {
spc = (*from==' ')? 1 : 0;
*to++ = *from++;
if(!to[-1])break;
}
}
return str;
}
int main(){
char input[]= " abc de f ";
printf("\"%s\"\n", uniq_spc(input));//output:" abc de f "
return 0;
}
答案 3 :(得分:1)
#include&lt; stdio.h&gt;&#xA; #include&lt; stdlib.h&gt;&#xA; void remove_blanks(char * s);&#xA;&#xA; int main() &#XA; {&#XA; char const s [] = {'1','','','2','','','3'};&#xA; remove_blanks(S);&#XA;的printf( “%S”,S);&#XA; return 0;&#xA;}&#xA;&#xA; void remove_blanks(char * s){&#xA; int i = 0,delta = 0,cnt = 0;&#xA;&#xA; for(i = 0; s [i]; ++ i){&#xA; if(s [i] =='')cnt ++;&#xA; if(cnt> 1){&#xA; Δ+ = 1;&#XA; CNT = 0;&#XA; }&#XA; S [I-δ= S [I];&#XA; if(delta> 0)s [i] ='\ 0';&#xA;&#xA; }&#XA;}&#XA; 代码>
&#XA;
答案 4 :(得分:1)
你无法尝试这个简单的代码:
#include <stdio.h>
#define IN 1
#define OUT 0
int main() {
int c, spaces, state;
spaces = 0;
state = OUT;
while ((c = getchar()) != EOF) {
if ( c == ' ') {
++spaces;
state = OUT;
}
else if (state == OUT) {
state = IN;
spaces = 0;
}
if (c == ' ' && spaces > 1 && state == OUT)
c = 0;
putchar(c);
}
return 0;
}
答案 5 :(得分:0)
您必须修复以下for循环。 for循环的限制应为z
而不是n
for(j=i;j<n;j++)
input[j]=input[j+1];
通过
for(j=i;j<z;j++)
input[j]=input[j+1];
顺便说一句:你的scanf()
(读取字符串)获得的第一个字符是新行(\n
)。此换行符来自第一个scanf()
小数(%d
)
答案 6 :(得分:0)
为什么要让它变得比它需要的更复杂?您可以使用strtok
检查单个空格,然后忽略它们。然后你可以使用strcat
将字符串连接成一个完整的句子,然后你就完成了。
我就这样做了:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void) {
char *pch;
char sentence[1000];
char without[1000];
printf("Sentence: ");
fgets(sentence,1000, stdin);
strtok(sentence, "\n"); // remove any newlines
pch = strtok(sentence, " ");
while(pch != NULL) {
strcat(without, pch);
strcat(without, " \0");
pch = strtok(NULL, " ");
}
without[strlen(without)-1] = '\0'; // remove extra whitespace at the end
printf("|%s|\n",without);
return 0;
}
答案 7 :(得分:0)
#include<stdio.h>
#include<string.h>
int main(void)
{
char input[1000];
int i=0;
gets(input);
for(i=0;input[i]!='\0';i++)
{
if(input[i]!=' ' || input[i+1]!=' ')
printf("%c",input[i]);
}
return 0;
}