删除字符串中的最后一个字符。

5
我希望能删除字符串中的最后一个字符。 首先,我使用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;
}

1
strtok在while表达式中应该是循环体中的最后一条语句,而while表达式应该简单地检查ptr != NULL - WhozCraig
http://ideone.com/6u5odn - BLUEPIXY
3个回答

4
该程序会删除每个单词的最后一个字符。
#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

1
请注意,有未经检查的故障点可能导致未定义的行为。在继续程序之前检查fgets的成功非常重要。 - WhozCraig
1
在某些情况下,fgets() 可能会返回一个没有换行符的缓冲区:如果文件末尾没有换行符或者行比缓冲区容量更长。从 fgets 填充的缓冲区中安全地修剪换行符的方法是 string[p(strcspn(string, "\n")] = '\0'; - chqrlie

1

你的问题最好分为两个阶段解决:一方面使用 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表现不佳,除了其隐藏状态阻止嵌套使用之外,还有其他缺点。

谢谢你的回答!我需要更多地学习关于strtok函数的知识! :) - JeongHyun

0

由于您将delm保留为空格,因此它将在字符串中为以空格分隔的单词创建单独的标记,c风格的字符串包含其最后一个字符'\0',即空字符,因此它会删除该字符而不是文本中的最后一个字符。

看看这个 http://www.cprogramming.com/tutorial/c/lesson9.html

事实证明,C风格的字符串总是以空字符结尾,字面上是一个'\0'字符(值为0),


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接