具有多个 space 个字符的 printf 符号?
printf symbols with multiple space characters?
我有以下代码可以将标准输入中出现的制表符替换为四个 space。
当我有标准输入时,由两个 space 分隔,例如"tab tab",最后的 printf 打印正确的字符串 "tab tab",但是当我的输入是制表符分隔 "tab tab",然后添加四个 space 字符时,最后的 printf 只打印"tab" 字符串,仅此而已。任何建议表示赞赏。
#include <stdio.h>
#define MAX 1000
#define TAB 4
void read_stdin(char s[], int len);
int main(){
char str[MAX];
read_stdin(str, MAX);
return 0;
};
void read_stdin(char s[], int len){
int i, ii;
int c;
for (i = 0; i < len && (c = getchar()) != EOF; i++){
printf("c = %d, i = %d\n", c, i);
if (c == '\t'){
for (ii = 0; ii < TAB; ii++){
printf("space ");
s[i] = ' ';
i++;
printf("i = %d\n", i);
};
} else {
s[i] = c;
};
};
s[i] = '[=11=]';
printf("last i = %d\n", i);
printf("string completed: %s\n", s);
};
在控制台中,制表符由 space 个字符分隔
tab tab
c = 116, i = 0
c = 97, i = 1
c = 98, i = 2
c = 32, i = 3
c = 116, i = 4
c = 97, i = 5
c = 98, i = 6
c = 10, i = 7
last i = 8
string completed: tab tab
和由制表符分隔的制表符
tab tab
c = 116, i = 0
c = 97, i = 1
c = 98, i = 2
c = 9, i = 3
space i = 4
space i = 5
space i = 6
space i = 7
c = 116, i = 8
c = 97, i = 9
c = 98, i = 10
c = 10, i = 11
last i = 12
string completed: tab
你在内部循环中递增 i
太多了。
在内部循环退出后,i
的值为 7,这将是下一个要输入的字符的索引。但随后外循环迭代,再次增加 i
。所以你跳过写入索引 7。当你稍后尝试打印 s
时,它会读取这个未初始化的字符。在您的特定情况下,该字符恰好具有值 0,因此字符串似乎在那里结束。
在内循环结束时递减 i
以将其放回正确的位置。
for (ii = 0; ii < TAB; ii++){
printf("space ");
s[i] = ' ';
i++;
printf("i = %d\n", i);
};
i--;
我有以下代码可以将标准输入中出现的制表符替换为四个 space。
当我有标准输入时,由两个 space 分隔,例如"tab tab",最后的 printf 打印正确的字符串 "tab tab",但是当我的输入是制表符分隔 "tab tab",然后添加四个 space 字符时,最后的 printf 只打印"tab" 字符串,仅此而已。任何建议表示赞赏。
#include <stdio.h>
#define MAX 1000
#define TAB 4
void read_stdin(char s[], int len);
int main(){
char str[MAX];
read_stdin(str, MAX);
return 0;
};
void read_stdin(char s[], int len){
int i, ii;
int c;
for (i = 0; i < len && (c = getchar()) != EOF; i++){
printf("c = %d, i = %d\n", c, i);
if (c == '\t'){
for (ii = 0; ii < TAB; ii++){
printf("space ");
s[i] = ' ';
i++;
printf("i = %d\n", i);
};
} else {
s[i] = c;
};
};
s[i] = '[=11=]';
printf("last i = %d\n", i);
printf("string completed: %s\n", s);
};
在控制台中,制表符由 space 个字符分隔
tab tab
c = 116, i = 0
c = 97, i = 1
c = 98, i = 2
c = 32, i = 3
c = 116, i = 4
c = 97, i = 5
c = 98, i = 6
c = 10, i = 7
last i = 8
string completed: tab tab
和由制表符分隔的制表符
tab tab
c = 116, i = 0
c = 97, i = 1
c = 98, i = 2
c = 9, i = 3
space i = 4
space i = 5
space i = 6
space i = 7
c = 116, i = 8
c = 97, i = 9
c = 98, i = 10
c = 10, i = 11
last i = 12
string completed: tab
你在内部循环中递增 i
太多了。
在内部循环退出后,i
的值为 7,这将是下一个要输入的字符的索引。但随后外循环迭代,再次增加 i
。所以你跳过写入索引 7。当你稍后尝试打印 s
时,它会读取这个未初始化的字符。在您的特定情况下,该字符恰好具有值 0,因此字符串似乎在那里结束。
在内循环结束时递减 i
以将其放回正确的位置。
for (ii = 0; ii < TAB; ii++){
printf("space ");
s[i] = ' ';
i++;
printf("i = %d\n", i);
};
i--;