[英]Reverse a string without strtok in C
處理使用 RPN(逆波蘭表示法)的程序。
我有一個函數可以在不使用strtok
或觸發printf
情況下反轉字符串的所有單詞(與在線和此處找到的所有解決方案不同)。
該函數實際上部分工作,因為它打印給定字符串的所有單詞,除了最后一個,我需要幫助弄清楚發生了什么。
char *extract(char s[]) {
if (s[0] == '\0')
return NULL;
int i = 0;
char *p = NULL;
while (s[i] != '\0') {
if (s[i] == ' ')
p = s + i;
i++;
}
if (p != NULL) {
*p = '\0';
return p + 1;
}
}
然后像這樣在 main 中調用它:
char s[MAX] = "5 60 +";
while(s != NULL){
printf("%s\n", extract(s));
}
輸出為+ 60
,光標無休止地等待某事,但預期輸出應為+ 60 5
標准方法是反轉字符串中的每個單詞,然后反轉整個字符串。
這個給你。
#include <stdio.h>
#include <string.h>
static char * reverse( char *s, size_t n )
{
for ( size_t i = 0; i < n / 2; i++ )
{
char c = s[ i ];
s[ i ] = s[ n - i - 1 ];
s[ n - i - 1 ] = c;
}
return s;
}
char * reverse_by_words( char *s )
{
const char *delim = " \t";
char *p = s;
while ( *p )
{
p += strspn( p, delim );
if ( *p )
{
char *q = p;
p += strcspn( p, delim );
reverse( q, p - q );
}
}
return reverse( s, p - s );
}
int main(void)
{
char s[] = "5 60 +";
puts( s );
puts( reverse_by_words( s ) );
return 0;
}
程序輸出是
5 60 +
+ 60 5
如果您想保留原始字符串中的前導和尾隨空格,則函數可以如下所示
#include <stdio.h>
#include <string.h>
static char *reverse( char *s, size_t n )
{
for ( size_t i = 0; i < n / 2; i++ )
{
char c = s[i];
s[i] = s[n - i -1 ];
s[n - i - 1] = c;
}
return s;
}
char * reverse_by_words( char *s )
{
const char *delim = " \t";
char *first = s, *last = s;
for ( char *p = s; *p; )
{
p += strspn( p, delim );
if ( last == s ) first = last = p;
if ( *p )
{
char *q = p;
p += strcspn( p, delim );
last = p;
reverse( q, p - q );
}
}
reverse( first, last - first );
return s;
}
int main(void)
{
char s[] = "\t\t\t5 60 +";
printf( "\"%s\"\n", s );
printf( "\"%s\"\n", reverse_by_words( s ) );
return 0;
}
程序輸出是
" 5 60 +"
" + 60 5"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.