[英]Using strcat to append spaces. Compiles but overwrites string
我使用的语言是C。
我正在尝试使用内置的c字符串函数的混合,以获取标记列表(以空格分隔)并将其“转换”为标记列表,并用引号将其分隔。
像这样的字符串
回声“你好1 2 3 4”测试test2
转换为
[回声] [“你好] [1] [2] [3] [4”] [测试] [test2]
然后,我使用我的代码(在底部) 尝试将其转换为类似
[回声] [你好1 2 3 4] [测试] [测试2]
由于某种原因,引用语句中的第二个“令牌”将被覆盖。 这是遍历令牌列表并将其转换为新代码的代码段。
88 for (int i = 0; i < counter; i++) {
89 if ( (strstr(tokenized[i],"\"") != NULL) && (inQuotes == 0)) {
90 inQuotes = 1;
91 tokenizedQuoted[quoteCounter] = tokenized[i];
92 strcat(tokenizedQuoted[quoteCounter]," ");
93 } else if ( (strstr(tokenized[i],"\"") != NULL) && (inQuotes == 1)) {
94 inQuotes = 0;
95 strcat(tokenizedQuoted[quoteCounter],tokenized[i]);
96 quoteCounter++;
97 } else {
98 if (inQuotes == 0) {
99 tokenizedQuoted[quoteCounter] = tokenized[i];
100 quoteCounter++;
101 } else if (inQuotes == 1) {
102 strcat(tokenizedQuoted[quoteCounter], tokenized[i]);
103 strcat(tokenizedQuoted[quoteCounter], " ");
104 }
105 }
106
107 }
简而言之,在char *
添加一个空格意味着它所指向的内存需要更多的字节。 由于未提供该char *
,因此将用\\0
覆盖下一个“单词”的第一个字节,因此该char *
被解释为空字符串。 请注意,写入未保留的位置是未定义的行为,因此实际上可能发生任何事情(从分段错误到“正确”结果,没有错误)。
使用malloc
为扩展结果创建一个新缓冲区,并为其提供足够的字节数(如果是malloc
请不要忘记free
旧缓冲区)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.