Tag: string literals

使用strcat追加字符数组不起作用

有人可以告诉我这段代码有什么问题吗??? char sms[] = “gr8″; strcat (sms, ” & :)”);

地址长度的字符串文字

我看到在使用GCC的Linux系统上,字符串文字的地址似乎比其他变量小得多。 例如,以下代码生成下面显示的o / p。 #include int main() { char *str1 = “Mesg 1”; char *str2 = “Mesg 2”; char str3[] = “Mesg 3”; char str4[] = “Mesg 4”; printf(“str1 = %p\n”, (void *) str1); printf(“str2 = %p\n”, (void *) str2); printf(“&str3 = %p\n”, (void *) str3); printf(“&str4 = %p\n”, (void *) str4); return 0; } […]

避免在printf的包装中发出警告

我正在编写的小C库中有一个错误报告function。 除了普通errorfunction之外,我还想提供一个errorf函数,以便轻松地在错误消息中嵌入信息。 /* * Prints a formatted error message. Use it as you would use ‘printf’. See the * ‘sio_error’ function. */ void sio_errorf(const char *format, …) { // Print the error prefix if (g_input == STDIN) fputs(“error: “, stderr); else fprintf(stderr, “%s: “, g_progname); // Pass on the varargs on to ‘vfprintf’. va_list arglist; […]

结构vs字符串文字? 只读与读写?

C99标准是否允许写复合文字(结构)? 它似乎不提供写文字字符串。 我问这个是因为它在C编程:现代方法,第 406页第2版​​中说 。 问:允许指向复合文字的指针似乎可以修改文字。 是这样的吗? 答:是的。 复合文字是可以修改的左值。 但是,我不知道它是如何工作的,以及它如何与字符串文字一起工作,你当然无法修改。 char *foo = “foo bar”; struct bar { char *a; int g; }; struct bar *baz = &(struct bar){.a = “foo bar”, .g = 5}; int main () { // Segfaults // (baz->a)[0] = ‘X’; // printf( “%s”, baz->a ); // Segfaults // foo[0] = […]

C和C ++之间的字符串文字差异

据我所知,在C ++ 11之前,字符串文字在C和C ++之间几乎完全相同。 现在,我承认C和C ++在处理宽字符串文字方面存在差异。 我能找到的唯一区别在于通过字符串文字初始化数组。 char str[3] = “abc”; /* OK in C but not in C++ */ char str[4] = “abc”; /* OK in C and in C++. Terminating zero at str[3] */ 而技术上的差异只在C ++中很重要。 在C ++中, “abc”是const char [4]而在C中它是char [4] 。 但是,C ++有一个特殊的规则,允许转换为const char * ,然后转换为char *以保持C兼容性,直到C ++ 11不再应用该特殊规则时。 文字允许长度的差异。 但是,实际上任何编译C和C […]

strtok未处理的exception;访问冲突写入位置

#include #include #include char *matrix[10][10]; int main(void) { int i; char *list[4]; char *words[20] = { ” cat “, ” car “, ” bear “, ” ship “, ” mouse “, ” beatle “, ” coat “, ” nest “, ” ice “, ” sugar “, ” bacon “, ” frown “, ” smile “, […]

当我们能够或不能修改字符串文字

#include int main () { char *s=”FIGHT” ; printf(“\n Whole string is %s “, s ); // Printing FIGHT — this is fine s[0]=’L’ ; printf (“\n Now whole string is %s”, s ); // Printing LIGHT — My Question is how string literal constant is getting modified when it is being stored in read […]

为什么gcc允许char数组初始化,字符串文字比数组大?

int main() { char a[7] = “Network”; return 0; } C中的字符串文字在内部以nul字符终止。 因此,上面的代码应该给出一个编译错误,因为字符串文字Network的实际长度是8,它不能适合char[7]数组。 但是,Ubuntu上的gcc (甚至是-Wall )编译此代码时没有任何错误或警告。 为什么gcc允许这样做而不将其标记为编译错误? 当char数组大小小于字符串文字时,gcc仅发出警告(仍然没有错误!)。 例如,它警告: char a[6] = “Network”; [相关] Visual C ++ 2012为char a[7]提供了编译错误: 1>d:\main.cpp(3): error C2117: ‘a’ : array bounds overflow 1> d:\main.cpp(3) : see declaration of ‘a’

总线错误故障排除

我正在尝试反转一个字符串。 这是我试过的代码: #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 […]

函数参数中的字符串

int main() { char *x = “HelloWorld”; char y[] = “HelloWorld”; x[0] = ‘Z’; //y[0] = ‘M’; return 0; } 在上面的程序中, HelloWorld将处于只读部分(即字符串表)。 x将指向该只读部分,因此尝试修改该值将是未定义的行为。 但是y将被分配在堆栈中, HelloWorld将被复制到该内存中。 所以修改y将正常工作。 字符串文字:指针与字符数组 这是我的问题: 在以下程序中,如果内容被修改, char *arr和char arr[]都会导致分段错误。 void function(char arr[]) //void function(char *arr) { arr[0] = ‘X’; } int main() { function(“MyString”); return 0; } 它在function参数上下文中有何不同? 没有为函数参数分配内存? 请分享您的知识。