web-dev-qa-db-ja.com

C文字列の最後の文字を削除します

最初に文字列の最後の文字を削除したいのですが、strtok関数を使用しています。入力は:"Hello World Yaho" 私が使う " "私の区切り文字として

私の期待はこれです

Hell
Worl
Yah

しかし、実際の出力はこれです

Hello
Worl
Yaho

どうすればこの問題を解決できますか?この出力が理解できません

これは私のコードです

int main(int argc, char*argv[])
{
   char *string;
   char *ptr;
   string = (char*)malloc(100);

   puts("Input a String");
   fgets(string,100,stdin);

   printf("Before calling a function: %s]n", string);

   ptr = strtok(string," ");

   printf("%s\n", ptr);

   while(ptr=strtok(NULL, " "))
   {
      ptr[strlen(ptr)-1]=0;
      printf("%s\n", ptr);
   }

   return 0;
}
6
JeongHyun

このプログラムは、すべての単語の最後の文字を削除します。

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

int main(int argc, char*argv[]){

    char *string;
    char *ptr;
    string = (char*)malloc(100);
    puts("Input a String");
    fgets(string,100,stdin);
    printf("Before calling a function: %s\n", string);
    string[strlen(string)-1]=0;
    ptr = strtok(string," ");
    printf("%s\n", ptr);
    while(ptr){
        ptr[strlen(ptr)-1]=0;
        printf("%s\n", ptr);
        ptr = strtok(0, " ");
    }
    return 0;
}

あなたは覚えておく必要があります

  1. 末尾の改行から文字列を削除します
  2. Strtokを適切に使用する

テスト

Input a String
Hello World Yaho
Before calling a function: Hello World Yaho

Hello
Hell
Worl
Yah
4
Niklas

問題は、2つのフェーズに分割することで最もよく解決されます。フレーズを単語に解析し、必要に応じてstrtokを使用し、最後の文字を省略した単語を別の関数で印刷します。

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

static void print_truncated_Word(const char *ptr) {
    int len = strlen(ptr);
    if (len > 0) len -= 1;
    printf("%.*s", len, ptr);
}

int main(int argc, char*argv[]) {
    char buf[128];
    char *ptr;

    puts("Input a string: ");
    if (fgets(buf, sizeof buf, stdin) == NULL) {
        /* premature end of file */
        exit(1);
    }
    printf("Before calling a function: %s\n", string);

    ptr = strtok(string, " \n");
    while (ptr) {
        print_truncated_Word(ptr);
        ptr = strtok(NULL, " \n");
    }
    return 0;
}

print_truncated_Word関数はバッファを変更しません。関数の明示的な目的でない限り、入力引数への副作用は回避する必要があります。 strtokは、ネストされた使用を妨げる隠された状態などの他の欠点の中でも、この点で不適切に動作します。

Delmをスペースとして保持したため、文字列内のスペースで区切られた単語に対して個別のトークンが作成され、cスタイルの文字列には最後の文字が「\ 0」、つまりnull文字として含まれるため、テキストの最後の文字ではなくその文字が削除されます。

これをチェックしてください http://www.cprogramming.com/tutorial/c/lesson9.html

cスタイルの文字列は常にヌル文字、文字通り「\ 0」文字(値0)で終了することがわかります。

0