2016-12-31 4 views
2

Вот простой код, пытаясь очистить пробелы от массива символов, но вывод не похож на ожидаемый «YasserMohamed».putchar() function: неоднозначный вывод

#include<stdio.h> 

int main() 
{ 
    char x[]="Yasser Mohamed"; 
    char ch; 
    int i=0; 
    while (x[i]!='\n') 
    { 
     if(x[i]!=' ') 
      putchar(x[i]); 
     i++; 
    } 
    system("pause"); 

    return 0 ; 
} 
+1

Рассмотрите другие ответы, чтобы отметить лучший ответ. –

+0

Для функции 'system()' требуется инструкция: '#include ', которой не указан код. – user3629249

+0

команда 'pause' shell не переносима, она находится только в окнах. общий способ реализации аналогичной функции: 'int ch; while ((ch = getchar()! = EOF && '\ n'! = ch); getchar(); ' – user3629249

ответ

5

Нет Новая линия ('\n') in x. Таким образом, условие не так и должно быть:

while (x[i]) /* until the null byte is found */ 
{ 
    if (x[i] != ' ') 
     putchar(x[i]); 
    i++; 
} 
+1

Примечание: более явно писать' x [i]! = '\ 0'', но может привести к записи 'x [i]! =' 0''. – Stargateur

2

Ваша строка в x не содержит символ новой строки '\n', который используется в качестве условия в цикле.

Используйте while (x[i]!=0x00), чтобы закончить при завершении NUL знак (0x00).

+1

" * Используйте 'while (x [i]! = 0x00)' * "или' while (x [ i]! = 0) 'или' while (x [i]! = '\ 0') 'или просто' while (x [i]) '. – alk

1

Там нет в оригинальном x не \n, так что вы просто продолжать итерацию неинициализированный памяти, пока не случится столкнуться \n. Вместо этого, вы должны повторять до строки символ завершения - \0:

while (x[i] != '\0') { 
// Here --------^ 
1

Вы также можете использовать 0 вместо '\ 0' (точно такой же стоимости), как и что:

for (int i = 0; x[i] != 0; i++) { 
    if (x[i] != ' ') 
     putchar(x[i]); 
} 
1

есть нулевой символ в конце строки с нулевым завершением, а не новая строка.

вы должны изменить '\n' на '\0' или 0 (который является кодом ASCII нулевого символа).

#include<stdio.h> 


int main() 
{ 

    char x[]="Yasser Mohamed"; 
    char ch; 
    int i=0; 
    while (x[i]!='\0') 
    { 
     if(x[i]!=' ') 
      putchar(x[i]); 
     i++; 
    } 
    system("pause"); 

    return 0 ; 

} 
2

Это потому, что вы никогда не прекращали цикл вы написали

while(x[i]!='\n') 
    { 
     //What You Want To Do. 
      } 

Но x[i] не '\n' для любого x[i] определен.

Это будет работать, если вы вместо этого напишите его как i!= 14. Тогда Loop остановился бы в конце вашего имени. Going Beyond не определено, поскольку это не ваша область с переменной памятью.

Или вы также можете написать while(x[i]), поскольку конец строки в C завершен нулем \0, который вычисляет значение false, поэтому цикл остановится.

Правильный код может быть

#include<stdio.h> 
int main() 
{ 

    char x[]="Yasser Mohamed"; 
    char ch; 
    int i=0; 
    while (x[i]) //As Null Character '\0' evaluates to false it would stop the loop 
    { 
     if(x[i]!=' ') 
      putchar(x[i]); 
     i++; 
    } 
    system("pause"); 

    return 0 ; 

} 
1

Обновленный код:

int main() 
{ 
    char x[]="Yasser Mohamed"; 
    char ch; 
    int i=0; 
    while (x[i]!='\0') 
    { 
     if(x[i]!=' ') { 
      printf("%c", x[i]); // replace putchar with printf 
      fflush(stdout); // force character to appear 
     } 
     i++; 
    } 
    printf("\n"); // print newline so shell doesn't appear right here 
    return 0 ; 
} 

Строки оканчиваются нулем \0 символы не Newlines.

Кроме того, вы должны добавить оператор fflush (по крайней мере, на linux), чтобы убедиться, что каждый символ печатается.

Чтобы сделать ваш вывод красивым, добавьте новую строку после цикла.

Я заменил ваш звонок putcharprintf, чтобы узнать, поможет ли это, когда я запустил вашу программу. putchar, скорее всего, также будет работать нормально.

Я удалил system(pause), потому что он, похоже, не помог. Вместо этого я добавил символ символа новой строки.

Смежные вопросы