在C中反转不带strtok的字符串
在使用RPN(反向波兰符号)的程序上工作 我有一个函数可以反转字符串中的所有单词,而不使用在C中反转不带strtok的字符串,c,split,char,reverse,c-strings,C,Split,Char,Reverse,C Strings,在使用RPN(反向波兰符号)的程序上工作 我有一个函数可以反转字符串中的所有单词,而不使用strtok或触发printf(与在线和此处找到的所有解决方案不同) 该函数实际上部分工作,因为它打印给定字符串的所有单词(最后一个除外),我需要帮助了解发生了什么 char *extract(char s[]) { if (s[0] == '\0') return NULL; int i = 0; char *p = NULL; while (s[i] !
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;
}
}
然后它主要被称为:
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;
}
如果您希望保持前导空格和尾随空格与原始字符串中的相同,那么函数可以按以下方式查看
#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;
}
为什么要反转字符串?反向波兰语被设计为从左到右解析,使用堆栈来存储中间值。a将对您有所帮助。当
p
为NULL
时(当未找到空格字符时),您的extract
函数不会返回任何内容。我认为在这种情况下,它应该返回一个指向字符串s
开头的指针。@androidexpert35您没有添加一个。您的示例很小,但不完整。顺便说一句,你的las编辑弄乱了格式。如果你在编译过程中出现警告,或者使用调试器逐级处理代码,那么这应该很容易修复。
#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"