Retain formatting in printf with %s [closed] - c

Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 10 months ago.
Improve this question
So I have a string char *str = someString(); and I want to print the string and retain any formatting that may be present in the string with printf("%s", str); So for instance, if str were equal to "\033[32mPassed!\n\033[0m", I would want it to print Passed! in green followed by a new line. But currently, it prints the string literally.
Is this something printf can do or is it not designed for this? I understand that this could cause issues if the string contained something like %d without actually having a number passed.

Sending ␛[32mPassed!␊␛[0m to the terminal is what causes the desired effect.[1]
You are asking how convert the string "\033[32mPassed!\n\033[0m" into the string ␛[32mPassed!␊␛[0m, just like the C compiler does when provided the C code (C string literal) "\033[32mPassed!\n\033[0m".
printf does not provide a way to convert a C string literal into the string it would produce.
And nothing else in the standard library does either. The functionality of parsing C code is entirely located in the compiler, not in the executable it produces.
You will need to write your own parser. At the very least, you will need to do the following:
Remove the leading and trailing quotes.
Replace the four character sequence \033 with character 0x1B.
Replace the two character sequence \n with character 0x0A.
Footnotes
Assuming the terminal understands these ANSI escape sequences.

Related

How to allow user to input both string and int at the same time using C [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 2 years ago.
Improve this question
I was wondering if someone knows how to allow a user to input both string(char) and integers at the same time where each character of the input is verified. An example of the input would be "05JK1010". I’ve only started studying the C language last week so I only have this figured out
char studentID [20];
printf("Enter your student ID:\n");
scanf("%s", &studentID );
You're close but I think I have a better way of doing this. GNU libc's scanf accepts ranges with its %[ format, like this:
scanf("%19[0-9a-zA-Z]", studentID);
You should put a different size in place of 19 if you resize your array. This is in place to ensure that scanf doesn't overflow the buffer.
Also, you generally shouldn't take the address of one of scanf's parameters if the format specifier for that parameter is %s or %[.
If you require a portable solution, then it's a mouthful:
scanf("%19[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]", studentID);
For more details about scanf, see my post What can I use for input conversion instead of scanf?
C doesn't have a facility to allow integers and chars to be input at the same time.
Like Joshua commented above characters are just integers represented as ASCII symbols.
If you need the numbers entered to be in numerical integer form, you would have to parse them from the string and use various methods to convert them to there numerical value.
C does have a function that will convert ASCII to integer atoi()
http://www.cplusplus.com/reference/cstdlib/atoi/
PLEASE note, atoi() dose not have error checking, this is just to give you ideas.

Comparing a char to the char '\"' [closed]

Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 2 years ago.
Improve this question
I'm working on C and need to recieve a string from the user in the format of "abcd", and to diagnose it to retrieve it as a string of "abcd"(int the code).
For some reason when I try to check if the first char in the string (that I've read using sscanf) is " it doesn't return it is, as you can see in the picture below. The watch says that data[0] is '"', but that data[0] == '"' is false, which is absurd.
The character in data[0] is probably a special quotation mark with the ASCII (or rather Windows-1252) code 147/0x93. It is a number in which the highest bit is 1, and as such is outside the 7 bit ASCII range. While the 7 bit ASCII codes are interpreted identically across many character sets this is not so for 8 bit values (> 127). The "glyph" a given terminal or printer will show for 8 bit values depends on the char set is assumes (in your case, as mentioned, Windows-1252).
Last not least, because on your system chars are signed the debugger interprets the highest bit as a minus sign and shows a negative value. I think you can cast it in the debugger watch expression to unsigned char to obtain the positive equivalent.
That character cannot be entered directly with the keyboard; on Windows you can try to use the Alt+Number block trick. When you enter the normal quotation mark you create a char with the ASCII code 34/0x22, which the compiler and debugger correctly claim is not identical.

Scanf and format changer [closed]

Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 4 years ago.
Improve this question
scanf is a function which takes user inputs. But according to the code in the picture the compiler understands 34 as the value for "y", but it is only the neglected input of x, so can anyone explain this?
Scanning for the %2d directive stops when the two digits 12 have been read. That leaves "3" as the next character in the input stream.
Then the space character in the format string says to skip white space characters (spaces, tabs, and so on), if there are any. There are not, so “3” remains the next character in the input stream.
Then the %d specifier causes a decimal integer to be read, so 34 is assigned to y.
If you wish to skip the digits remaining after x is scanned, you can use %*[0-9] to scan and ignore digits until a non-digit is seen., as in %2d%*[0-9] %d %*f %5s.

Unknown characters when printing text file in c [closed]

Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 5 years ago.
Improve this question
I am trying to print the characters from a text file using C in CodeBlock terminal. I use getc and printf. But the terminal shows unwanted characters as well. For example,
when I read,
CAAAAATATAAAAACAGGTTTATGATATAAGGTAAAGTATGGGAGATGGGGACAAAAGT
It shows,
CΘA A A A A T A T A A A A A C A G G T T T A T G A T A T A A G GT A A A G T A T$GhGêG╝A G<AöT G#GñG<G AxC A A A A G T
Can any one please state what can be done to avoid this situation.
Your text file obviously uses a 2byte character encoding. If this is on windows, it's very likely UTF-16.
char in C is a single byte, so a single-byte encoding is assumed. There are many ways to solve this, e.g. you could use iconv. On windows, you can use wchar_t(*) to read the characters of this file (together with functions for wide characters like getwc() and if you need it in an 8byte encoding, windows API functions like WideCharToMultiByte() can help.
wchar_t is a type for "wide" characters, but it's implementation-defined how many bytes a wide character has. On windows, wchar_t has 16 bits and typically holds UTF-16 encoded characters. On many other systems, wchar_t has 32 bits and typically holds UCS-4 encoded characters.

UTF-8 encoding in c [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
Closed 9 years ago.
Questions asking for code must demonstrate a minimal understanding of the problem being solved. Include attempted solutions, why they didn't work, and the expected results. See also: Stack Overflow question checklist
Questions concerning problems with code you've written must describe the specific problem — and include valid code to reproduce it — in the question itself. See SSCCE.org for guidance.
Improve this question
what is UTF-8 encoding? I google it but could not able to understand what it is. Please explain in simple words and example.
Next I need to encode one string in UTF-8 encoding. I got openssl but it is converting in only base64 format.
#include<stdio.h>
struct some
{
char string[40];
};
int main()
{
string *s;
char str[9];
gets(str);
strcpy(s,str);
/*Now how to get emcoded form of "Hello" in UTF-8*/
/*printf("encoded data");
return 0;
}
Those strings are available at runtime so do not anything about what is coming. and after encoding need to store them in DB.
I checked it on SO itself but could not find any source in c, it is available in .net java c#. I am using linux Redhat.
Encodings describe what bytes or sequence of bytes correspond to what characters. ASCII is the simplest encoding. In ASCII a single byte value corresponds to a single character. Unfortunately there are more than 255 characters in the world. UTF-8 is probably the most common encoding format because it is compatible with english ASCII, but also allows international characters. If you write a standard english string in C it is already UTF-8. "Hello" == "Hello"
Joel has a fantastic article about this subject called: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
It does a good job of explaining ASCII, unicode, and UTF8 string encodings.
In UTF-8, every code point from 0-127 is stored in a single byte. Only
code points 128 and above are stored using 2, 3, in fact, up to 4 (not 6, corrected by R.)
bytes.

Resources