简述:
我String.Trim使用win32和标准C api(使用MSVC2008进行编译,因此我可以访问所有C++的东西,如果需要,但我只是试图修剪一个char*).
鉴于存在strchr,strtok以及其他字符串函数的所有方式,肯定应该有装饰功能,或者一个可以改变用途...
谢谢
可能的重复:
在C中修剪前导/尾随空格的无痛方法?
修剪C中的字符串
嗨伙计们,我在c中编写String trim方法,这是我提出的代码.我认为它可以消除前导和尾随空格,但我希望代码可以更清晰.你能建议改进吗?
void trim(char *String)
{
int i=0;j=0;
char c,lastc;
while(String[i])
{
c=String[i];
if(c!=' ')
{
String[j]=c;
j++;
}
else if(lastc!= ' ')
{
String[j]=c;
j++;
}
lastc = c;
i++;
}
Run Code Online (Sandbox Code Playgroud)
这段代码看起来干净吗?
C 编程语言表示,这些函数<ctype.h>遵循一个共同的要求:
ISO C99,7.4p1:
在所有情况下,参数都是 an
int,其值应表示为 anunsigned char或应等于宏的值EOF。如果参数有任何其他值,则行为未定义。
这意味着以下代码是不安全的:
int upper(const char *s, size_t index) {
return toupper(s[index]);
}
Run Code Online (Sandbox Code Playgroud)
如果此代码在char具有相同值空间的实现上执行,signed char并且字符串中有一个具有负值的字符,则此代码调用未定义行为。正确的版本是:
int upper(const char *s, size_t index) {
return toupper((unsigned char) s[index]);
}
Run Code Online (Sandbox Code Playgroud)
尽管如此,我还是在 C++ 中看到了许多不关心这种未定义行为可能性的例子。那么 C++ 标准中是否有任何内容可以保证上述代码不会导致未定义的行为,或者所有示例都是错误的?
【附加关键词:ctype cctype isalnum isalpha isblank iscntrl isdigit isgraph islowwer isprint ispunct isspace isupper isxdigit tolower]
我一直在尝试在scanf上使用正则表达式,以便读取最多n个字符的字符串并丢弃其他任何内容,直到新行字符.任何空格都应被视为常规字符,因此包含在要读取的字符串中.我研究了维基百科有关正则表达式的文章,但我无法让scanf正常工作.这是我尝试过的一些代码:
scanf("[ ]*%ns[ ]*[\n]", string);
Run Code Online (Sandbox Code Playgroud)
[]应该用于实际的空格字符,*应该表示一个或多个,n是要读取的字符数,string是用malloc分配的指针.我尝试了几种不同的组合; 但是我倾向于只获得一个句子的第一个单词(停留在空格中).此外,*似乎丢弃一个字符而不是意味着"零或更多"......
任何人都可以详细解释scanf如何解释正则表达式?更重要的是,重复使用getc是否有效?
提前致谢
我最近在C中开始了一个小玩具项目,并且一直在试图模仿作为python字符串对象一部分的strip()功能的最佳方法.
读取fscanf或sscanf表示字符串被处理到遇到的第一个空格.
fgets也无济于事,因为我仍然有新的线条.我确实尝试了一个strchr()来搜索空格并将返回的指针设置为'\ 0',但这似乎不起作用.
我正在编写一些需要读取fasta文件的代码,因此我的部分代码(包含在下面)是一个fasta解析器.由于单个序列可以跨越fasta格式的多行,我需要将从文件读取的多个连续行连接成一个字符串.我这样做,通过在读取每一行后重新分配字符串缓冲区,成为序列的当前长度加上读入的行的长度.我做了一些其他的东西,比如剥离空白等.一切顺利第一个序列,但fasta文件可以包含多个序列.所以类似地,我有一个动态的结构数组,有两个字符串(标题和实际序列),是"char*".再次,当我遇到一个新标题(由以'>'开头的行引入)时,我增加序列数,并重新分配序列列表缓冲区.关于为第二个序列分配空间的realloc段错误
*** glibc detected *** ./stackoverflow: malloc(): memory corruption: 0x09fd9210 ***
Aborted
Run Code Online (Sandbox Code Playgroud)
对于我的生活,我不明白为什么.我通过gdb运行它,一切似乎都在工作(即一切都已初始化,值似乎是理智的)......这是代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <errno.h>
//a struture to keep a record of sequences read in from file, and their titles
typedef struct {
char *title;
char *sequence;
} sequence_rec;
//string convenience functions
//checks whether a string consists entirely of white space
int empty(const char *s) {
int i;
i = 0;
while (s[i] != 0) {
if (!isspace(s[i])) …Run Code Online (Sandbox Code Playgroud) char testStr[] = " trim this ";
char** pTestStr = &testStr;
trim(pTestStr);
int trim(char** pStr)
{
char* str = *pStr;
while(isspace(*str)) {
(*pStr)++;
str++;
}
if(*str == 0) {
return 0;
}
char *end = str + strlen(str) - 1;
while(end > str && isspace(*end))
end--;
*(end+1) = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我写了这个函数:
void r_tabs_spaces(char *input) {
int i;
for (i = 0; i < strlen(input); i++)
{
if (input[i] == ' ' || input[i] == '\t')
input[i] = '';
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我编译并运行它时,编译器在我尝试输入[i] =''的行中抱怨"错误:空字符常量";
那怎么能用C做呢?
可能重复:
如何以标准方式修剪前导/尾随空格?
我需要从字符串的开头和结尾删除所有空格,例如,如果我的字符串是
" hello world. "
Run Code Online (Sandbox Code Playgroud)
(没有引号),我需要打印
"hello world."
Run Code Online (Sandbox Code Playgroud)
我试过这样的事情:
size_t length = strlen (str);
for (newstr = str; *newstr; newstr++, length--) {
while (isspace (*newstr))
memmove (newstr, newstr + 1, length--);
Run Code Online (Sandbox Code Playgroud)
但它会删除所有空格.
我该如何解决?