2016-12-10 13 views
0

私はまったく新しいコーディングですが、私がしたいのは、文字列を書き、文字列に書き込まないことを希望します。私はfgets(removedChar, 2, stdin);の代わりにremovedChar = getchar()を使ってみましたが、ifの文で!=を実行することはできません。C、配列の比較、文字の検索

本当にありがとうございます。

int main() { 
    char str[20], removedChar[2]; 
    int i, n, j; 

    printf("ENTER A STRING:"); 
    fgets(str, 20, stdin); 
    printf("ENTER WHAT CHAR YOU WISH TO REMOVE: "); 
    fgets(removedChar, 2, stdin); 

    n = strlen(str); 
    for (i = 0, j = 0; i < n; i++) { 
     if (strcmp(str, removedChar) == 0) { 
      str[j] = str[i]; 
      j++; 
     } 
     if (str[i] == ' ') { 
      str[j] = str[i]; 
      j++; 
     } 
    } 
    str[j] = '\0'; 
    printf("string after removing character = %s", str); 

    system("pause"); 

    return 0; 
} 
+1

'fgets'が最後にリターンが含まれています。ここでは

は修正版です。 – usr2564301

+2

'#include '、 '#include '、 '#include 'がありません。 – melpomene

+0

@RadLexusバッファが小さすぎるとは限りません。 – melpomene

答えて

2

まずこのライン:2つの文字列が同一である場合

if (strcmp(str, removedChar) == 0) 

を比較しています。 strcmpをご覧ください。

代わりに、文字列と文字列の等しいかわりに文字と比較する必要があります。

このようにして、文字列をループするだけで、一致する文字を除外してカウンターで適切に文字列を更新するために!=を使用できるようになりました。

さらに、戻り値fgetsをチェックし、バッファ長を超えていないことを確認することも常に安全です。

これは、これらのアイデアを使用するコードです:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define STRSIZE 20 

int 
main(int argc, const char *argv[]) { 
    char str[STRSIZE]; 
    int i, j, removedchar; 
    size_t slen; 

    printf("Enter a string: "); 
    if (fgets(str, STRSIZE, stdin) == NULL) { 
     printf("Error reading string\n"); 
     return 1; 
    } 

    slen = strlen(str); 

    if (slen > 0) { 
     if (str[slen-1] == '\n') { 
      str[slen-1] = '\0'; 
     } else { 
      printf("Error: Exceeded Buffer length of %d.\n", STRSIZE); 
      return 1; 
     } 
    } 

    if(!*str) { 
     printf("Error: No string entered.\n"); 
     return 1; 
    } 

    printf("Enter what character you wish to remove: "); 
    removedchar = getchar(); 

    if (removedchar == '\n') { 
     removedchar = ' '; 
     printf("No character was entered. Spaces will be removed if found\n"); 
    } 

    j = 0; 
    for (i = 0; str[i] != '\0'; i++) { 
     if (str[i] != removedchar) { 
      str[j++] = str[i]; 
     } 
    } 
    str[j] = '\0'; 

    printf("Changed String = %s\n", str); 

    return 0; 
} 
+0

'frl()'が 'NULL'を返さなかった場合、' strlen(str) 'が' 0'をどのように返すのか疑問に思う人のために、 '\ 0'バイトが行頭にある入力ストリームに挿入します。これは端末の入力が容易ではありませんが、慎重に作成された入力ファイルは、この可能性を利用してプログラムをクラッシュさせたり、少なくとも定義されていない動作を呼び出すことができます。 – chqrlie

1

あなたは完全な文字列を比較strcmp()を使用してstr[i] != removedChar[0]の代わりに使用する必要があります。

また、改行文字は、fgets()の文字列から削除する必要があります。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) { 
    char str[80], removedChar[80]; 
    int i, n, j; 

    printf("ENTER A STRING: "); 
    if (!fgets(str, sizeof str, stdin)) 
     return 1; 
    str[strcspn(str, "\n")] = '\0'; // strip the newline character if present 

    printf("ENTER WHAT CHAR YOU WISH TO REMOVE: "); 
    if (!fgets(removedChar, sizeof removedChar, stdin)) 
     return 1; 

    for (i = 0, j = 0; str[i] != '\0'; i++) { 
     if (str[i] != removedChar[0]) { 
      str[j] = str[i]; 
      j++; 
     } 
    } 
    str[j] = '\0'; 
    printf("string after removing character = %s\n", str); 

    system("pause"); 

    return 0; 
}