Tag: string

C中的EOF问题

我正在编写一个程序,它应该读取两个可以包含换行符和其他各种字符的字符串。 因此,我使用EOF(Ctrl-Z或Ctrl-D)结束字符串。 这适用于第一个变量,但是使用第二个变量,然而,这似乎是有问题的,因为显然某些东西卡在输入缓冲区中而用户无法输入任何内容。 我试着用while (getchar() != ‘\n’);清理缓冲区while (getchar() != ‘\n’); 和几个类似的变化,但似乎没有任何帮助。 所有清洁尝试都导致无限循环,如果没有清洁,添加第二个变量是不可能的。 这两个变量的字符都是在这样的循环中读取的: while((c = getchar()) != EOF) ,这表明它是我在缓冲区中停留的EOF。 或者它是否以其他方式影响程序的行为? 我正在使用的逻辑有什么问题吗? 经过几个小时的挣扎,我开始有点绝望了。 [编辑:下面添加代码] [编辑2:clearerr()似乎使这个EOF解决方案毕竟有效。 它似乎以我在Linux下的原始forms运行,我昨天在Windows上试用它。 码: #include #include int main(void) { int x = 0; int c; char a[100]; char b[100]; printf(“Enter a: “); while((c = getchar()) != EOF) { a[x] = c; x++; } […]

将std :: string传递给C风格API是否安全?

很好地定义了C ++将std :: vector传递给期望输出数组的C API,因为std :: vector是连续的: std::vector myArray(arraySize); cStyleAPI(&myArray[0], arraySize); 将std :: string以相同的方式传递给C API是否安全? 在标准C ++ 03中是否有任何保证std :: string是连续的并且在这种情况下以与std :: vector相同的方式工作?

C字符串库

C(不是C ++)的C字符串库是否实现了对char *和wchar_t *字符串的抽象? 要求是: 获得BSD / MIT / CDDL许可 实现某种引用计数机制 支持正则表达式 有Unicode支持 谢谢,

在C中声明Pascal样式的字符串

在C中,有一个很好的方法来首先定义长度,Pascal样式的字符串作为常量,所以它们可以放在ROM中吗? (我正在使用一个带有非GCC ANSI C编译器的小型嵌入式系统)。 例如,C字符串被终止。 { ‘f’ , ‘o’ , ‘o’ , 0 }。 Pascal字符串的长度在第一个字节中,例如。 { 3 , ‘f’ , ‘o’ , ‘o’ }。 我可以声明一个C字符串放在ROM中: const char *s = “foo”; 对于Pascal字符串,我可以手动指定长度: const char s[] = {3, ‘f’, ‘o’, ‘o’}; 但是,这很尴尬。 有没有更好的办法? 也许在预处理器中?

如何使用格式字符串攻击

假设我有以下代码: #include #include #include int num1 = 0; int main(int argc, char **argv){ double num2; int *ptr = &num1; printf(argv[1]); if (num1== 2527){ printf(“Well done”); } if(num2 == 4.56) printf(“You are a format string expert”); return 0; } 我正在努力了解如何正确行事,但我无法用互联网上的指南来组织我的思想。 它假设是这样的: ./Program %p %p %p %p 然后 ./Program $( printf “\xAA\xAA\xAA\xAA”) %.2523d%n 我只是想不出来,请帮我解决这个问题。 其重点是通过prinft函数将字符串利用到正在运行的程序中。 我需要得到“做得好”和“你是格式字符串专家”才能打印出来。 就我而言,通过Linux终端/ […]

总线错误故障排除

我正在尝试反转一个字符串。 这是我试过的代码: #include #include int main(){ char *c=”I am a good boy”; printf(“\n The input string is : %s\n”,c); printf(“\n The length of the string is : %d\n”,strlen(c)); int i,j; char temp; int len=strlen(c); for(i=0,j=len-1;i<=j;i++,j–) { temp=c[i]; c[i]=c[j]; c[j]=temp; //printf("%c\t%c\n",*(c+i),*(c+(len-i-1))); } printf("\n reversed string is : %s\n\n",c); } 代码输出Bus error : 10 。 但是,如果我重写相同的代码: int […]

如何在支持空字段的同时使用sscanf解析逗号分隔字符串中的字段?

我有一个逗号分隔的字符串,可能包含空字段。 例如: 1,2,,4 使用基本的 sscanf(string,”%[^,],%[^,],%[^,],%[^,],%[^,]”, &val1, &val2, &val3, &val4); 我得到空字段之前的所有值,以及从空字段开始的意外结果。 当我从sscanf()中删除空字段的表达式时, sscanf(string,”%[^,],%[^,],,%[^,],%[^,]”, &val1, &val2, &val3, &val4); 一切都很好。 由于我不知道何时会得到一个空字段,有没有办法重写表达式以优雅地处理空字段?

gcc的非空终止字符串编译器选项

更新 原来这只是“c ++不是c布鲁斯”的另一个案例 我想要的是 const char hex[16] = “0123456789ABCDEF”; 唯一有效的 char hex[16] = “0123456789ABCDE”; hex[15] = “F”; 是否有任何编译器选项或我可以做的事情使gc​​c编译器中的字符串不为null终止。 这样我就可以制作一个(n)常数数组

使用sscanf将C字符串拆分为标记

我试图将一个字符串拆分成令牌,但有点递归。 我想解析: “content=0&website=Google” 这样我就可以拿出参数和值了。 如果我尝试strtok我最终会破坏我要解析两次的字符串。 所以我试过了 char *contents = “content=0&website=Google” char arg[100]; char value[100]; sscanf(contents, “%s&%s”, arg, value); 作为第一遍,希望再次解析arg ,但它失败了, arg包含整个字符串。 我尝试使用”%s\&%s”思考并且是一个保留字,但没有运气。 救命! 编辑: 这是我的strtok hack: static void readParams(char * string, char * param, char * value) { printf(“This is the string %s\n”,string); char * splitted = strtok (string,”=”); while (splitted != NULL) { printf(“This […]

将字符串文字与char文字连接起来

我想连接一个字符串文字和char文字。 在语法上不正确, “abc” ‘d’ “efg”呈现编译器错误: xc:4:24:错误:预期’,’或’;’ 在’d’之前 到现在为止,我必须使用snprift(不必要),尽管字符串文字的值和编译时知道的char文字。 我试过了 #define CONCAT(S,C) ({ \ static const char *_r = { (S), (C) }; \ _r; \ }) 但它不起作用,因为S的空终止符未被剥离。 (除了给出编译器警告。) 有没有办法编写一个宏来使用 “abc” MACRO(‘d’) “efg”或 MACRO1(MACRO2(“abc”, ‘d’), “efg”)或 MACRO(“abc”, ‘d’, “efg”) ? 如果有人问我为什么要这样:char文字来自一个库,我需要将字符串作为状态消息打印出来。