繁体   English   中英

使用strcat追加空格。 编译但覆盖字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM